IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Serveur/Client Files de message


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Serveur/Client Files de message
    Bonjour, je dois réaliser un serveur d’informations du système. Un client pourra émettre une requête pour demander :
    – les informations concernant un utilisateur à partir de son uid (login, nom réel, groupe, répertoire dédié, shell utilisé) ;
    – les informations sur un processus en fonction de son pid (commande, propriétaire, état) ;

    J'ai une erreur de segmentation que je n'arrive pas à résoudre :
    Code client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <pwd.h>
    #include <fcntl.h>
    #include <mqueue.h>
    #include <string.h>
    #include <sys/stat.h>
     
    #define NOM_FILE "/question_f"
     
    struct question{
    	int type;
    	int data;
    	char * nomTubeRep;
    };
     
    int main(){
    	printf("Entrez le type de la question(1 = question sur l'utilisateur\n");
    	printf(",2 sur un programme : ");
     
    	int type;
    	int data;
    	scanf("%d",&type);
     
    	printf("\nMaintenant entrez l'uid ou le pid : ");
    	scanf("%d",&data);
    	char * nomFileRep = "";
    	printf("Maintenant entrez le nom que vous souhaitez donner pour recevoir\n"); 
    	printf("la reponse(le nom doit être précédé d'un \'/\' : ");
    	scanf("%s",nomFileRep);
     
    	char * msg = "";
    	char * dataS ="";
    	sprintf(msg,"%d",type);	
    	sprintf(dataS,"%d",data);
    	strcat(msg,";");
    	strcat(msg,dataS);
    	strcat(msg,";");
    	strcat(msg,nomFileRep);
     
    	mqd_t fdq = mq_open(NOM_FILE,O_WRONLY);
    	if(fdq == -1){
    		perror("mq_open");
    		exit(EXIT_FAILURE);
    	}
     
    	struct mq_attr attr;
    	attr.mq_maxmsg = 6;
    	attr.mq_msgsize = sizeof(char)*258;
     
    	mqd_t fdr = mq_open(nomFileRep,O_RDONLY|O_CREAT,S_IRUSR|S_IWUSR,&attr);
    	if(fdr == -1){
    		perror("mq_open");
    		exit(EXIT_FAILURE);
    	}
    	mq_send(fdq,msg,attr.mq_msgsize,(int)NULL);
    	char buf[254];
    	while(mq_receive(fdr,buf,sizeof(buf),NULL) != -1){
    		printf("On entre dans le while");
    		printf("%s",buf);
    	}
    	exit(EXIT_SUCCESS);
    }
    Code serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <pwd.h>
    #include <fcntl.h>
    #include <mqueue.h>
    #include <string.h>
    #include <grp.h>
    #include <sys/stat.h>
     
    #define NOM_FILE "/question_f"
     
    /**struct question{
            int type;
            int data;
            char * nomTubeRep;
    };*/
     
    void traite_question(char * q){
    	char * rep = "Infos sur l'utilisateur :\n";
    	int type = atoi(strtok(q,";"));
    	int data = atoi(strtok(NULL,";"));
    	char * nomFileRep = strtok(NULL,";");
    	int uidPid = 0;
     
    	switch(type){
    		case 1 :	uidPid = data;
    					struct passwd * pw = getpwuid(uidPid);
    					if(pw == NULL){
    						perror("getpwuid");
    						exit(EXIT_FAILURE);
    					}
    					char * login = pw->pw_name;
    					struct group * gr = getgrgid(pw->pw_gid);
    					if(gr == NULL){
    						perror("getgrgid");
    						exit(EXIT_FAILURE);
    					}
    					char * groupe = gr->gr_name;
    					char * directory = pw->pw_dir;
    					char * usedShell = pw->pw_shell;
    					strcat(rep,"UID : ");
    					char * uid_s ="";
    					sprintf(uid_s,"%d",uidPid);
    					strcat(rep,uid_s);
    					strcat(rep,"\nLogin : ");
    					strcat(rep,login);
    					strcat(rep,"\nGroupe : ");
    					strcat(rep,groupe);
    					strcat(rep,"\n Répertoire dédié : ");
    					strcat(rep,directory);
    					strcat(rep,"\nShell Utilisé : ");
    					strcat(rep,usedShell);
    					strcat(rep,"\n");
    					break;
     
    		case 2 :	uidPid = data;
    					break;
     
    		default : perror("Mauvais type");
    	}
    	mqd_t fdr = mq_open(nomFileRep,O_WRONLY);
    	if(fdr == -1){
    		perror("mq_open");
    		exit(EXIT_FAILURE);
    	}
    	printf("Sa arrive ici");
    	mq_send(fdr,rep,sizeof(char)*254,(int)NULL);
    	if(mq_close(fdr) == -1){
    		perror("mq_close");
    		exit(EXIT_FAILURE);
    	}
    }
     
     
    int main(){
    	char * q = "";	
     
    	struct mq_attr attr;;
    	attr.mq_maxmsg = 6;
    	attr.mq_msgsize = sizeof(char)*64;
     
    	mqd_t fdq = mq_open(NOM_FILE,O_RDONLY|O_CREAT,S_IRUSR|S_IWUSR,&attr);
    	if(fdq == -1){
    		perror("mq_open_Quest");
    		exit(EXIT_FAILURE);
    	}
     
    	while((mq_receive(fdq,q,attr.mq_msgsize,NULL))!= -1){                      
    		traite_question(q);
    	}
     
    	exit(EXIT_SUCCESS);
    }
    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char * nomFileRep = "";
    ...
    	scanf("%s",nomFileRep);
    - La chaine nomFileRep, déclarée de cette façon, est non modifiable
    - Cette chaine de toute façon ne comporte qu'un unique char, insuffisant pour placer la chaine récupérée par scanf()

    Il faut déclarer un tableau, suffisamment grand, de char : char nomFileRep[256]; .
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. TP : Connexion serveur - client et envoi message
    Par leilald dans le forum Réseau
    Réponses: 5
    Dernier message: 13/12/2013, 21h43
  2. message non envoyé serveur->client
    Par lmplmp dans le forum Réseau
    Réponses: 1
    Dernier message: 05/04/2011, 17h55
  3. Client/Serveur Socket, envoyer un message précis
    Par Chyokyka dans le forum Débuter
    Réponses: 4
    Dernier message: 24/03/2009, 17h59
  4. Serveur/Client sous linux
    Par black is beautiful dans le forum Réseau
    Réponses: 2
    Dernier message: 13/08/2004, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo