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 :

Impossible de lire un socket : le read() retourne segmentation fault


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Par défaut Impossible de lire un socket : le read() retourne segmentation fault
    Bonjours tous le monde.
    Ça semble simple, ça doit probablement l'Être, mais là je seche.
    Je m'entriane tranquillement à faire dialoguer un client et un serveur tout bêtes, avec de simple chaines de caractère mais au moment de fiare un read() par le client, apres un write du serveur, le programme client plante et retourne un une segmentation fault.
    Le pire c'est que ça marche tres bien dans un sens : si mon client ne fait qu'ecrire sans lire, le serveur lit sans probleme et tous se déroule correctement. C'est lorsque le serveur ecrit quelque chose sur le socket que là le client plante en voulant lire.

    Le 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
     int fd_client = accept (fd, &client,(socklen_t*)&client_len);
            pid_t p_client = fork ();
     
     
            if (p_client == 0)
      	{ 
    	  char buf[301];
    	  int n;
    	  close( fd);
     
    	  while(strcmp(buf,"END") != 0){
     
     
        	    if((n = read (fd_client, buf, 300)) >= 0)
        	      {
     
        		buf[n] = '\0';
        		cout<<buf<<"\n";
        	      }
     
     
    	    int b = write (fd_client,"OK", 7);
     
    	  }
     
    	  close (fd_client);
      	  exit (0);
     
      	}
    et le 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
    char buf[301]="";
      int n;
      char* s;
      while(strcmp(s,"q") !=0){
     
        printf ("client connecté à %s (%d.%d.%d.%d) port=%d\n",
    	    server_addr,
    	    (ntohl (server.sin_addr.s_addr) >> 24) & 0xff,
    	    (ntohl (server.sin_addr.s_addr) >> 16) & 0xff,
    	    (ntohl (server.sin_addr.s_addr) >> 8) & 0xff,
    	    (ntohl (server.sin_addr.s_addr) >> 0) & 0xff,
    	    (ntohs (server.sin_port)));
        scanf("%s",s);
        write (fd, s, 7);
         if ((n = read (fd, buf, 300)) <= 0){ //voila le read en question qui ne veut pas se faire
           buf[n] = '\0';                            //si j'enleve tous ça l'affaire fonctionne
           cout << buf<<"\n";
         }
     
      }
    Merci à ceux qui ont pris le temps de lire et de reflechir un peu.

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Ton code est du C++ et tu es dans un forum C...
    J'ai particulièrement apprécié le :
    Enfin, j'ai de gros doute la dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* s;
    while(strcmp(s,"q") !=0)
    scanf("%s",s);
    write (fd, s, 7);
    tu crois faire quoi là?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Par défaut

    Effectivement le coup du serveur serveur... Enfin j'ai corrigé.
    Sinon concernant le coté C++ du code mis à part les "cout", je crois que tous le reste est du C? ou je me trompe?

    Pour ce qui est de ta remarque sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* s;
    while(strcmp(s,"q") !=0)
    scanf("%s",s);
    write (fd, s, 7);
    c'est une boucle pour lire ce que j'écris au clavier, qui s'arrette si je tape q, et qui envoie ce que j'ai tapé au server. (fd étant le déscripteur de fichier du socket connecté au serveur).
    J'aurai certe dû initialisé ma variable (chose faite), mais cette boucle j'ai l'impression qu'elle marche si j'empeche le client de "lire" le socket. Je peux ecrire tout ce que je veux et c'est envoyé au serveur qui me l'affiche (un peu nul mais faut bien se faire la main...), jusqu'à que j'envoye un END (qui ferme la connexion du coté serveur) ou un q, qui ferme la connexion coté client.

    En tout cas merci d'avoir jeté un coup d'oeil.

    Je précise que j'ai passé tout ça sous gdb, et que le Segmentation Fault apparait vraiment au moment d'executer le "read()", je n'arrive même pas a entre dans la fonction à l'aide du step.

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Je repose ma question, que crois tu faire en faisant ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* s;
    scanf("%s",s);
    rien ne te choque?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Par défaut
    Hum, je reflechi...
    le %s? qui devrait peut-être être un %c? non.
    Scanf a besoin d'un tableau de taille définie, et donc il me faudrait déclarer s plutot du genre :
    je me rapproche?

  6. #6
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Sykaa Voir le message
    Hum, je reflechi...
    le %s? qui devrait peut-être être un %c? non.
    Scanf a besoin d'un tableau de taille définie, et donc il me faudrait definir s plutot du genre :
    je me rapproche?
    C'est déjà mieux, oui...

  7. #7
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Sykaa Voir le message
    Sinon concernant le coté C++ du code mis à part les "cout", je crois que tous le reste est du C? ou je me trompe?
    C'est du C uniquement si c'est compilé avec un compilateur C...
    Pour ce qui est de ta remarque sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* s;
    while(strcmp(s,"q") !=0)
    scanf("%s",s);
    write (fd, s, 7);
    c'est une boucle pour lire ce que j'écris au clavier, qui s'arrette si je tape q, et qui envoie ce que j'ai tapé au server. (fd étant le déscripteur de fichier du socket connecté au serveur).
    J'aurai certe dû initialisé ma variable (chose faite), mais cette boucle j'ai
    Gné ? On peut voir le vrai code qui pose problème ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    C'est du C uniquement si c'est compilé avec un compilateur C...

    Gné ? On peut voir le vrai code qui pose problème ?
    Le code qui "posait" problème, est dans mon premier post.
    "posait" car le seg fault n'est plus... Merci. Le comportement n'est pas encore tout a fait celui que j'attendais, mais au moins je ne bloque plus.
    Il va par contre falloir que j'essaye de comprendre pour quelles raisons celà posait problème au read(), qui n'avait à premiere vu rien à voir avec la vilaine chaine de caractères non constante que j'avait déclarer..
    Encore merci, et désolé pour la pollution C++...

  9. #9
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Sykaa Voir le message
    Il va par contre falloir que j'essaye de comprendre pour quelles raisons celà posait problème au read(), qui n'avait à premiere vu rien à voir avec la vilaine chaine de caractères non constante que j'avait déclarer..
    Ne perd pas ton temps à expliquer un comportement indéfini. Tout peut arriver. Point. Passe plutôt du temps à comprendre comment écrire du code sans comportements indéfinis...

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

Discussions similaires

  1. socket read retourne 0
    Par saturn1 dans le forum Réseau
    Réponses: 0
    Dernier message: 30/05/2010, 11h28
  2. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50
  3. Impossible de lire les enregistrements
    Par Bowen dans le forum ASP
    Réponses: 2
    Dernier message: 04/08/2005, 11h33
  4. impossible de lire 2 fois de suite un fichier
    Par porcher dans le forum C++
    Réponses: 8
    Dernier message: 14/02/2005, 01h44
  5. [VB.NET] Impossible de lire le contenu du datagrid
    Par jagdjg dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2004, 21h51

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