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

Réseau C Discussion :

Lecture dans le socket


Sujet :

Réseau C

  1. #1
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut Lecture dans le socket
    Bonjour,
    j'ai un problème de lecture/écriture dans un socket. Je me suis déjà heurté à ce problème mais je n'ai pas trouvé la solution.
    Un client écrit des données dans le socket et le serveur doit les récuperer. Plus précisement , dans mon programme, le client écrit d'abord un char puis un entier. Pour l'instant je veux juste que le serveur affiche ça.

    Voici le code le bout de code correspondant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // SERVEUR
    	// reading socket for command 
    	numbytes = recv(client_sock, &command, sizeof(int), 0);
    	checkRecv(numbytes);
    	printf("\nCommand: %c", command);
     
    	// reading socket for data size	
    	numbytes = recv(client_sock, &data_size, sizeof(int), 0);
    	checkRecv(numbytes);		
    	printf("\nData size: %i", data_size);
    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
     
    // CLIENT
    	char *message = "Hello there!";
    	int data_size;
    	// command type
    	numbytes = send(sock, &ECHO, sizeof(char), 0);	// sending message
    	checkSend(numbytes);
    	printf("\nCommand : %c", ECHO);
     
    	sleep(TEMPO);
     
    	// data size
    	data_size = strlen(message);
    	numbytes = send(sock, &data_size, sizeof(int), 0);	// sending message
    	checkSend(numbytes);
    	printf("\nData size : %i bytes", data_size);
    ECHO est un char qui est dans un fichier .h à part et vaut 1.

    Le serveur récupère bien la 1ere lecture dans le socket mais la deuxieme ne se fait plus bien. Il affiche un entier aléatoire. Vous remarquer que j'ai mis une temporisation dans le client. Si je mets 1sec de temporisation, le serveur arrive bien à récuperer la deuxième lecture. !? Etrange non ?

    merci.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tex-Twil
    Le serveur récupère bien la 1ere lecture dans le socket mais la deuxieme ne se fait plus bien. Il affiche un entier aléatoire. Vous remarquer que j'ai mis une temporisation dans le client. Si je mets 1sec de temporisation, le serveur arrive bien à récuperer la deuxième lecture. !? Etrange non ?
    Rien à voir avec le langage C. (Enfin, je voudrais bien savoir ce qu'il y a dans CheckSend())

    Il n'y a pas forcément synchronisme entre émission et réception. L'emission des données pourrait très bien se faire dans une seule trame, et la reception dans cette même trame (donc en une fois). C'est au récepteur de savoir ce qu'il a à faire et de compter les octets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Send('A')
    Send(123) --->'A'123--->Receive()--->'A'123 : à découper en 'A' puis 123
                            Receive()-> ????

  3. #3
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    Les fonction checkRecv et checkSend ne font que vérifier que le retour des fonctions send et recv n'est pas négatif.

    Je ne suis pas sur de comprendre le fonctionnement de send et recv.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Send('A')
    Send(123) --->'A'123--->Receive()--->'A'123 : à découper en 'A' puis 123
                            Receive()-> ????
    Comment je peux découper en A puis en 123. Je pensais que je découpe justement en effectuant une lecture de la taille d'un car et puis une lecture de la taille d'un int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Send('A')
    Send(123) --->123'A'--->
                 --->123--->Receive(sizeof(char))--->'A'
                        --->Receive(sizeof(int))-> 123
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // lecture du 'A'
    numbytes = recv(client_sock, &command, sizeof(char), 0);
    ...
    // le socket contient encore le 123
    ...
    //lecture de 123
    numbytes = recv(client_sock, &data_size, sizeof(int), 0);

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tex-Twil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // lecture du 'A'
    numbytes = recv(client_sock, &command, sizeof(char), 0);
    ...
    Ben oui, mais tu avais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // SERVEUR
    	// reading socket for command 
    	numbytes = recv(client_sock, &command, sizeof(int), 0);
    evidemment, c'est pas pareil...

  5. #5
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    j'avais pas vu !!!! shame on me !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/05/2009, 12h56
  2. probleme lecture dans un socket
    Par sneb5757 dans le forum Réseau
    Réponses: 8
    Dernier message: 02/12/2006, 17h40
  3. [C#] Lecture dans un endroit précis d'un fichier ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/10/2004, 14h36
  4. Réponses: 12
    Dernier message: 14/06/2004, 14h06
  5. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 21h42

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