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 :

Segmentation Default , je ne trouve pas l'erreur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Segmentation Default , je ne trouve pas l'erreur
    Bonsoir ,

    Le debugger a trouvé que cette fonction a un soucis , sans préciser ce qu'il y a .
    J'en ai donc déduis que j'ai fais une gaffe , mais je ne vois pas pourquoi .

    _s est une phrase ( "bonjour toi " , " comment va " ) .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int client::emission(const char* _s)
    {
    	int r;
        socklen_t recsize = sizeof(_s);
    	r = send(fd, (void *) _s, recsize, 0);
    	return r;
    }
    Quelqu'un saurait qu'est-ce que je peux faire ?
    Dernière modification par Bousk ; 08/05/2013 à 20h44.

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    sizeof d'un pointeur te retourne la taille d'une adresse (généralement 4 sur les système 32 bits et 8 sur les système 64 bits).
    Pour avoir la taille d'un tableau de char qui se termine par '\0', tu peux utiliser strlen.
    Je te conseille très vivement d'oublier les char * et d'utiliser au plus vite std::string.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir , merci du retour .

    J'ai tout essayé , mais sans façon :

    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
    int client::emission(const char* _s)
    {
    int r;
        size_t recsize = sizeof(_s);
    r = send(fd, (void *) _s, recsize, 0);
    return r;
    }
     
    int client::emission(const char* _s)
    {
    int r;
        size_t recsize = strlen(_s);
    r = send(fd, (void *) _s, recsize, 0);
    return r;
    }

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    La deuxième version devrait être "correcte". Tu as créé un main minimal qui appelle cette fonction pour la tester ? Si oui, elle reproduit l'erreur (et peux-tu la poster ici) ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    ma boule de crystal a profité des jours fériés pour partir en week-end.

    "ca marche pas" c'est pas une erreur, indiquer une segfault n'aide pas non plus à la vue du code...
    Où est située la segfault ?!

    Ton code originel est déjà faut, il faudrait avant tout (re)voir les bases. La longueur d'une chaîne c'est strlen.

    Ensuite, tu catapultes un fd dont on ne sait absolument rien.
    Est-ce un socket ? un fichier ? un... ?

    Enfin, en envoyant strlen caractères, tu n'envoies pas le \0 final. Est-ce voulu ?

    Btw, l'envoi sur socket se fait en général dans une boucle, parce que la méthode send(sock, datas, len, flags) envoit au maximum len char (datas est un const char* et non un void* il me semble).
    Et que tout comme debugage réseau, les sources de problèmes sont démultipliées:
    - code client émission
    - code serveur réception
    - qualité du réseau
    - problème de réseau
    voire
    - code serveur émission réponse
    - code client réception réponse

    Donc définitivement, une segfault sur une ligne send reste une énigme.
    Mais si le debuger te le dit, pourquoi ne pas "breaker", analyser la stacktrace, et les variables en présence ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut .
    J'ai en effet oublié de préciser que fd est une socket . ( prog serveur client )

    Je précise que le prog ne crash pas dès le début . Il fait ce qu'on lui dit , puis lorsqu'on continue , là ça crash ..
    MAXDATASIZE est de XXXXXX . Donc ça suffit largement :-)

    J'espère que vous saurez m'aider .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int s::env(const char* _s) {
        int r;
         size_t recsize = strlen(_s);
    	r = send(sock_ev, (void *) _s, recsize, 0);
    	return r;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int s::rcp(char * buffer) {
        int num;
     
    	if ((num = recv(sock_recep,buffer,MAXDATASIZE,0)) == -1) {
    		cerr << "  erreur recv()" << endl;
    		exit(-1);
        }
    	buffer[num] = '\0';
        return num;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int ct::emi(const char* _s)
    {
    	int r;
        size_t recsize = strlen(_s);
    	r = send(fd, (void *) _s, recsize, 0);
    	return r;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int ct::rcp(char * mess)
    {
    	int num;
     
    	if ((num = recv(fd2,mess, MAXDATASIZE,0)) == -1)
    	{
    		cerr << " erreur recv()" << endl;
    		exit(-1);
    	}
    	mess[num] = '\0';
     
    	return num;
    }
    Peut être cela pourrait être du à un oubli de déconnection des sockets ?

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

Discussions similaires

  1. je ne trouve pas l'erreur dans mon programme
    Par Briska dans le forum Débuter
    Réponses: 19
    Dernier message: 04/04/2008, 09h21
  2. Réponses: 6
    Dernier message: 14/12/2006, 00h37
  3. Réponses: 4
    Dernier message: 10/08/2006, 13h44
  4. [Sécurité] boucle infinie je trouve pas l'erreur
    Par scorpking dans le forum Langage
    Réponses: 14
    Dernier message: 26/07/2006, 15h04
  5. je ne trouve pas l'erreur ?
    Par nourdine dans le forum Langage
    Réponses: 7
    Dernier message: 04/01/2006, 23h51

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