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 :

erreur sur l'information recuperee avec un socket AF_UNIX


Sujet :

C

  1. #1
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut erreur sur l'information recuperee avec un socket AF_UNIX
    Bonjour,

    je cherche à faire communiquer un processus père avec plusieurs processus fils, en utilisant les sockets unix (AF_UNIX).

    J'ai un processus père qui crée 3 fils, chaque fils va envoyer une chaîne de caractère via le socket, qui va être lue par le père.
    Je créé mes chaînes sans problèmes, j'ouvre ma paire de sockets (dois-je créer une paire pour chaque fils ?), j'arrive apparemment à envoyer les chaînes de caractères (pas d'erreur sur le write), mais les chaînes de caractères récupérées ne sont pas bonnes.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <string.h>
    #include <sys/socket.h>
    #include "common.h" 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
    #define PROCESS		3
    #define SLEEP		5
    #define PORT 1337
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int process = 0;
    int sv[2];
     
    int threadProd(int num){
    	int period=100; /* en millisecondes */
    	char type_objet[3];
    	char* trame = malloc(sizeof(char*));
    	Objet* info = malloc(sizeof(struct Objet)); 
    	char* num2;
     
    	sprintf(type_objet,"t%d\0",num);
    	sprintf(info->identificateur,"%s",type_objet);
    	sprintf(info->objet_content,"25\0");	
    	sprintf(trame,"%s%s",info->identificateur,info->objet_content);
     
    	if(write(sv[1], &trame, 5) <0)
    		printf("error on writing in socket\n");
    	printf("child: sent '%s'\n", trame);
     
    	free(info);
    	free(trame);
    	return 0;
    }
     
    int threadMACProd(){
    	char* buffer[PROCESS];
    	int r;
    	for(int i=0;i<PROCESS;i++)
    		buffer[i]=malloc(sizeof(char*));
     
    	for(int i=0;i<PROCESS;i++){
    		read(sv[0], buffer[i], 5);
            printf("parent: read '%c'\n", buffer[i]);
    	}
     
    	return 0;
    }
     
     
    int main()
    {
        pid_t pid;
     
    	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
    		perror("socketpair");
    		exit(1);
        }
     
    	while (process < PROCESS) {
     		pid = fork();
     		// Erreur à la creation du fils
    		if (pid < 0) {
    			perror("fork");
    			exit(EXIT_FAILURE); 
    		}
    		// Execution du Producteur
    		else if (!pid) {
    			pid = getpid();
    			threadProd(process);
    			return 0;
    		}
    		++process;
     
    	}
     
    	for(int i=0;i<PROCESS;i++){
    		threadMACProd();
    	}
     
    	return EXIT_SUCCESS;
    }
    Retour à l'exécution (besoin de Ctrl-C pour quitter) :
    # ./producteur
    child: sent 't025'
    parent: read ''
    parent: read '0'
    child: sent 't125'
    parent: read 'P'
    child: sent 't225'

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    dois-je créer une paire pour chaque fils ?
    Salut

    Pas obligé si le père n'a pas à communiquer avec les fils en même temps.

    Citation Envoyé par ManusDei Voir le message
    j'arrive apparemment à envoyer les chaînes de caractères (pas d'erreur sur le write), mais les chaînes de caractères récupérées ne sont pas bonnes.

    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
    int threadProd(int num){
    	int period=100; /* en millisecondes */
    	char type_objet[3];
    	char* trame = malloc(sizeof(char*));
    	Objet* info = malloc(sizeof(struct Objet)); 
    	char* num2;
    
    	sprintf(type_objet,"t%d\0",num);
    	sprintf(info->identificateur,"%s",type_objet);
    	sprintf(info->objet_content,"25\0");	
    	sprintf(trame,"%s%s",info->identificateur,info->objet_content);
    
    	if(write(sv[1], &trame, 5) <0)
    		printf("error on writing in socket\n");
    	printf("child: sent '%s'\n", trame);
    
    	free(info);
    	free(trame);
    	return 0;
    }
    Revois les paramètres attendus par write() (et peut-être aussi read() de l'autre coté j'ai pas regardé). Accessoirement, faire un malloc() + free() au sein de la même fonction est un peu inutile mais c'est toi qui voit. Toutefois, quand on alloue de la mémoire, vaut mieux allouer suffisamment de mémoire pour stocker les datas qu'on veut y mettre !!!

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 684
    Points
    13 684
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Accessoirement, faire un malloc() + free() au sein de la même fonction est un peu inutile mais c'est toi qui voit.
    Tu préfères faire des déclarations en statique ?

    La phrase si dessus n'est pas absolument pas ironique mais je trouve qu'elle en a l'air. Pas d'offense hein

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Tu préfères faire des déclarations en statique ?
    Ben quand je vois ça
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Objet* info = malloc(sizeof(struct Objet)); 
    ...
    free(info):

    Je pense que c'est plus pratique de mettre directement
    A condition que la pile puisse supporter bien entendu (mais c'est généralement le cas dans la plupart des situations)

    Citation Envoyé par Bktero Voir le message
    La phrase si dessus n'est pas absolument pas ironique mais je trouve qu'elle en a l'air. Pas d'offense hein
    Pas de pb

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 684
    Points
    13 684
    Billets dans le blog
    1
    Par défaut
    J'avoue qu'une fois que tu as sorti les deux lignes en question.....

    Pour une structure, effectivement ça devrait aller (sauf si la structure demande un tableau de plusieurs mega... mais bon). Si tu fais un tableau de structures, le problème de pile peut apparaitre plus vite. Comment connais-tu la taille de la pile ?

  6. #6
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    J'avais un problème de paramètre du write, et j'affichais mon string avec %c.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur sur filtre de TCD avec valeur d'une listbox
    Par Aureus Magnus dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/02/2015, 23h07
  2. [Débutant] Erreur sur un workflow crée avec SharePoint Designer
    Par azman dans le forum Configuration
    Réponses: 1
    Dernier message: 14/03/2013, 17h21
  3. Erreurs sur procédure PL/SQL avec fonction case
    Par Djene dans le forum PL/SQL
    Réponses: 2
    Dernier message: 07/10/2011, 18h19
  4. erreur sur dans Qt source avec C++ sous linux
    Par chochatown dans le forum Qt
    Réponses: 2
    Dernier message: 28/05/2009, 20h35
  5. Erreur sur inclusion types.h avec cygwin
    Par Bayard dans le forum Réseau
    Réponses: 12
    Dernier message: 12/11/2006, 17h48

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