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

Développement Discussion :

envoi en tcp qui marche pas bien


Sujet :

Développement

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut envoi en tcp qui marche pas bien
    Hello world !

    Je galère sur les sockets e C, mais plus pour très longtemps. J'ai quand même besoin de vos lumières pour un problème d'envoi de messages en TCP :

    D'un côté j'envoie une série de messages dans une boucle, et de l'autre, toujours dans une boucle, je les reçois. Sur l'essai que j'effectue, il y a 3 messages successifs, les deux premiers ayant la même taille, le dernier étant plus petit.
    L'émission des messages semble bien se passer, par contre à la réception c'est pas ça : Le premier message arrive parfaitement, mais la deuxième réception est plus grand de 37 octets que le premier, et contient d'ailleurs les 37 premiers octets de troisième message... Et le 3e message arrive tronqué puisqu'il manque les 37 premiers octets du message !

    Voici le code de l'envoi de message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char msg[520+1];
    sprintf(msg, "%s:%d:%d:%s", fic->nom, fic->taille, num, buffer);
    msg[n] = '\0';
    if(send(socktcp, msg, strlen(msg), 0) == -1)
    {
    	perror("Erreur lors de l'appel a send -> ");
    	exit(3);
    }
    bzero(msg, strlen(msg));
    Et le code de la réception (extrait du contexte, faites pas attention au while(1)) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while(1)
    {
    	char buffer[520+1];	// pb ici !?
    	int length;
    	bzero(buffer,520+1);
    	if((length = recv(socktcp2, buffer, sizeof(buffer), 0)) >= 0)
    	{
    		printf("message TCP recu (%d) : %s\n", length, buffer);
    		/* traitement */
    	}
    }
    Je ne pense pas que ça soit une question de '\0' à la fin car j'ai essayé avec et sans à l'émission et à la réception et ça ne semble pas changer grand chose... J'ai aussi essayé d'utiliser des bzero sans succès...

    Qu'en pensez-vous ?

  2. #2
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    Bonsoir a tous,

    D'apres les symptomes que tu décris je pense qu'en rajoutant buffer[length]='\0'; ca devrai marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	if((length = recv(socktcp2, buffer, sizeof(buffer), 0)) >= 0)
    	{
    		buffer[length]='\0';
    		printf("message TCP recu (%d) : %s\n", length, buffer);
    	}
    Tu dis recevoir 37 octets, or sizeof(buffer) retourn 4. Comment est ce possible ? ... Je pense que le code posté ne décrit pas au mieux le probleme rencontré.


    Citation Envoyé par zarbiman
    Je galère sur les sockets e C, mais plus pour très longtemps.
    Quelques liens sur la programmation des socket :
    Guide pour la programmation réseaux de Beej's
    relation client-serveur protocol TCP/IP
    documentation windows Send + exemple
    documentation windows Recv + exemple
    google...

    PS : Inspire toi des exemples de la documentation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        // Receive until the peer closes the connection
        do {
    
            int iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
            if ( iResult > 0 )
                printf("Bytes received: %d\n", iResult);
            else if ( iResult == 0 )
                printf("Connection closed\n");
            else
                printf("recv failed\n");
    
        } while( iResult > 0 );

  3. #3
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    salutations

    en raison des divers buffers existants entre ton application qui emet et celle qui reçois ... (notemment ceux de ton kernel)
    il est vraiment utopique de penser qu'un certains nombre de send() pourront être lu avec le même nombre de recv().

    2 petites choses sur ton code:
    -preferer snprintf en lieu et place de sprintf, risque 'important' de débordement.
    -d'où sors n?
    -3 n'est pas une valeur standard de retour
    -bzero est une fonction déprécié
    -si la connection est fermé à l'autre bout, tu ne le detecte pas, recv renverras 0.
    -while(1), c'est plutot moche, pourquoi pas while(recv ...) ?

Discussions similaires

  1. [AC-2013] Fonction compte qui marche pas bien
    Par djibouli dans le forum Macros Access
    Réponses: 4
    Dernier message: 12/07/2014, 10h41
  2. fonction drawrect qui marche pas bien..
    Par pikaTuX dans le forum Objective-C
    Réponses: 2
    Dernier message: 22/07/2010, 13h07
  3. Class herite de JButton qui marche pas bien
    Par MinsK dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/03/2008, 17h57
  4. Réponses: 2
    Dernier message: 22/09/2007, 11h39
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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