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 :

[Réseau] Error receiving data: Connection reset by peer


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut [Réseau] Error receiving data: Connection reset by peer
    Bonjour,

    J'ai quelques problèmes avec mes petits programmes client/serveur. J'ai un serveur qui accepte une seule connexion qui lit ce qu'on lui envoie et répond. Le client lui, se connecte, envoie une première trame, lit la réponse du serveur et renvoie une deuxième trame (fi_transmission). La connexion se termine alors avec le message Error receiving data: Connection reset by peer, je ne comprend pas d'où vient le problème, je sollicite donc votre aide.


    Une partie du 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
     
    int main (int argc, char * argv[]){
     
    char Buffer[1024];
    bzero (&Buffer, sizeof (Buffer));
    char reponse[6]={21,3,'1','3','1','\0'};
     
    /* Création de ma socket de connexion (je détaille pas tout ici) */
    listen_socket = socket(AF_INET,SOCK_STREAM,0);
     
    while(1){
     
    /* J'accepte la connexion (je détaille pas tout ici) */
    remote_socket = accept(listen_socket, (struct sockaddr *) &appelant, &sizeofappelant);
     
    	// Tant qu'on reçoit quelque chose
    	while(rc = recv(remote_socket, Buffer, sizeof(Buffer),0)){
    	//On lit les éventuelles données entrantes
    		if (rc < 0){
    			perror("Error receiving data");
    			close(remote_socket);
    			close(listen_socket);
    			exit(EXIT_FAILURE);
    		}
     
    		printf("Recu sur le serveur : %s\n", Buffer);
    		bzero (&Buffer, sizeof (Buffer));
     
     
    		if (send(remote_socket, reponse, sizeof(reponse), 0) < 0){
    			perror("Error while sending data");
    			close(remote_socket);
    			return 1;
    		}
    	}
     
    printf("Fin de la connexion\n");
    close(remote_socket);
     
    }
     
    	close(listen_socket);
     
    }
    Et une partie de mon 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
     
     
    char fin_transmission[10] = {4,3, '1', '3', '1', '\0'};
     
    if (connect(descripteur_socket,(struct sockaddr *)&info_socket, sizeof(struct sockaddr)) < 0){
    	perror ("Client : Erreur lors de la connexion (connect)\n");
    	close (descripteur_socket);
    	return 1;
    }
     
    /* On envoie les données */
    if (send(descripteur_socket, trame, strlen(trame), 0) < 0){
    	perror("Client : Erreur lors de l'envoi des données (send)\n");
    	printf("Erreur \n");
    	close(descripteur_socket);
    	return 1;
    }
     
    /* On récupère la réponse du serveur */
    if (recv(descripteur_socket, Buffer, sizeof(Buffer),0) < 0){
    	perror("Client : Erreur lors de la réception (send)");
    	printf("Erreur \n");
    	close(descripteur_socket);
    	return 1;
    }
     
    printf("Donnés reçues par le client : %s\n", Buffer);
     
    /* On renvoie des données */
    if (send(descripteur_socket, fin_transmission, strlen(fin_transmission), 0) < 0){
    	perror("Client : Erreur lors de l'envoi des données (send)\n");
    	close(descripteur_socket);
    	return 1;
    }
    Et voilà ce que j'ai en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Recu sur le serveur : $A8455484$B554845454575$C445$D5451254875457184578$E5857$F545$G87544545131 /* trame */
    Donnés reçues par le client : 131 /* reponse */
    Recu sur le serveur : 131 /* fin_transmission */
    Error receiving data: Connection reset by peer
    Je ne comprend pas pourquoi j'ai cette erreur.

    Merci d'avance pour votre aide.

  2. #2
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    A tout hazard: essaye de mettre un sleep(5) avant de fermer ta socket.

    Je suis pas sur, mais il est possible que l'information de fermeture arrive avant la réponse.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Mizar75
    A tout hazard: essaye de mettre un sleep(5) avant de fermer ta socket.

    Je suis pas sur, mais il est possible que l'information de fermeture arrive avant la réponse.
    D'après ce qui m'affiche ce n'est pas le cas.

    Je crois avoir trouvé mon erreur, c'est dans la boucle while "tant que je reçois des trucs" du serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(rc = recv(remote_socket, Buffer, sizeof(Buffer),0)!=-1){}
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(rc = recv(remote_socket, Buffer, sizeof(Buffer),0)){}
    Je ne suis pas sûr que ce soit la meilleure méthode pour écouter et traiter l'information reçu, mais ça m'a l'air de marcher. Si quelqu'un connait LA méthode pour récupérer les données une fois que la connexion socket est établie, je suis tout ouïe.

    Merci de t'être penché sur mon problème Mizar75.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Il faut utiliser select avant d'appliquer recv sinon ça peut bloquer

    http://emmanuel-delahaye.developpez.com/reseaux.htm

    Tu peux éventuellement mettre un timeout dans le select pour éviter que l'application se bloque si le serveur ou le client est mal programmé (volontairement ou involontairement)
    Je ne répondrai à aucune question technique en privé

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par millie
    Il faut utiliser select avant d'appliquer recv sinon ça peut bloquer

    http://emmanuel-delahaye.developpez.com/reseaux.htm

    Tu peux éventuellement mettre un timeout dans le select pour éviter que l'application se bloque si le serveur ou le client est mal programmé (volontairement ou involontairement)
    Ok, je vais tenter d'appliquer ça, merci pour le lien !

  6. #6
    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 : 67
    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 Zef14
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* On récupère la réponse du serveur */
    if (recv(descripteur_socket, Buffer, sizeof(Buffer),0) < 0){
    	perror("Client : Erreur lors de la réception (send)");
    	printf("Erreur \n");
    	close(descripteur_socket);
    	return 1;
    }
    Déjà, l'usage de send() est correct, mais pas celui de recv().

    http://emmanuel-delahaye.developpez....eaux.htm#texte
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Déjà, l'usage de send() est correct, mais pas celui de recv().

    http://emmanuel-delahaye.developpez....eaux.htm#texte
    Ca doit être mieux ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /* On récupère la réponse du serveur */ 
    int recu = recv(descripteur_socket, Buffer, sizeof(Buffer)-1,0) 
    if (recu< 0)
    { 
       perror("Client : Erreur lors de la réception (send)"); 
       printf("Erreur \n"); 
       close(descripteur_socket); 
       return 1; 
    } 
    Buffer[recu]=0;

  8. #8
    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 : 67
    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 Zef14
    Ca doit être mieux ainsi.
    Oui.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. [JMeter] Socket Write Error / Connection reset by peer ..
    Par quentinbenyahia dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 28/05/2015, 17h29
  2. Réponses: 5
    Dernier message: 14/03/2013, 14h54
  3. [Batch] Wget Read Error Connection Reset by peer
    Par tonio45312 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 12/01/2012, 12h39
  4. [TCP] Connection reset by peer
    Par lun4t1k dans le forum Développement
    Réponses: 1
    Dernier message: 26/03/2007, 22h14
  5. "Connection reset by peer"
    Par annecyrond dans le forum Autres Logiciels
    Réponses: 18
    Dernier message: 13/01/2006, 23h24

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