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++/CLI Discussion :

Probleme socket c++


Sujet :

C++/CLI

  1. #1
    Membre � l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par d�faut Probleme socket c++
    Bonjour � tous , voila je vous contact suite a un probl�me que j'ai depuis bient�t 1 mois , j'ai fait un programme qui lance une socket sur un serveur irc en c++ avec une interface QT , le robot se lance correctement mais plante quelques secondes apr�s voici les deux codes

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    int Connect_robot()
    {
        unsigned int ssocket2 = ssocket;
        int ret = 0;
        fd_set readfs;
        char buffer [2048] = {0};
     
     
        sendto_("NICK %s",nick);
        sendto_("USER %s",user);
        sendto_("JOIN %s","#chan,#chan2");
     
          while(1)
           {
     
     
              FD_ZERO(&readfs);
              FD_SET(ssocket2, &readfs); // sans ssocket2 - avertissement : comparison between signed and unsigned integer expressions
     
     
              if((ret = select(ssocket2, &readfs, NULL, NULL, NULL)) < 0)
                {
                   perror("select()");
                   exit(errno);
     
              }
     
     
              if (FD_ISSET(ssocket2, &readfs))
              {
     
               if ((recv(ssocket, buffer, sizeof(buffer) - 1, 0)) == -1)
               {
                   closesocket(ssocket);
                   return 1;
               }
     
                    msgbuffer(buffer);
     
             }
     
         }
        return 0;
      }
     
     
    int msgbuffer(char *buffer) {
     
     
        if (strstr(buffer, "PING :") != NULL && buffer[0] == 'P')
     
        {
            buffer[1] = 'O';
     
       if ((send(ssocket, buffer, strlen(buffer), 0)) == -1) {
     
           return 1;
       }
     
        if (strstr(buffer, "JOIN :You have not registered")) {
     
            sendto_("JOIN %s","#chan,#chan2"); }
            sendto_("PRIVMSG %s %s","#chan2",buffer);
     
     
        if (strstr(buffer, "ERROR :Closing Link:") != NULL && buffer[0] == 'E')
     
        {
            closesocket(ssocket);
     
            return 1;
     
        }
     
     }
     
        return 0;
    }

    Pouvez vous m'aider ?

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2011
    Messages
    1 255
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 1 255
    Par d�faut
    salut,

    l'indentation est horrible! Utilise la balise [CODE] :
    pour le reste c'est aussi compliquer de savoir pourquoi le robot plante.

    quand il plante tu es dans quelle partie de code c�t� serveur ? (en gros, dans la boucle while ou tu es d�j� sorti)

  3. #3
    Membre �prouv� Avatar de rakakabe
    D�veloppeur informatique
    Inscrit en
    Ao�t 2007
    Messages
    124
    D�tails du profil
    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 124
    Par d�faut
    +1 mala92.

    Quelques hypoth�ses possibles (lecture rapide du code):
    - ton socket n'est pas connect�,
    - v�rifie les options de select(): il se peut qu'elle se bloque tant que le descripteur n'est pas pr�t pour la lecture,
    - on essaie de lire sur un socket dej� ferm� par close().

  4. #4
    Membre � l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par d�faut
    La socket se connecte tr�s bien au serveur , je pense que �a vient de la while mais pourquoi �a , j'en sais rien , le compilateur me dit que tout est ok pourtant �a plante quand m�me

  5. #5
    Membre � l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par d�faut
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
     
    int Connect_robot()
     
    {
    unsigned int ssocket2 = ssocket;
    int ret = 0;
    fd_set readfs;
    char buffer [2048] = {0};
     
     
    sendto_("NICK %s",nick);
    sendto_("USER %s",user);
    sendto_("JOIN %s","#chan,#chan2");
     
    while(1)
    {
     
     
    FD_ZERO(&readfs);
    FD_SET(ssocket2, &readfs); // sans ssocket2 - avertissement : comparison between signed and unsigned integer expressions
     
     
    if((ret = select(ssocket2, &readfs, NULL, NULL, NULL)) < 0)
    {
    perror("select()");
    exit(errno);
     
    }
     
     
    if (FD_ISSET(ssocket2, &readfs))
    {
     
    if ((recv(ssocket, buffer, sizeof(buffer) - 1, 0)) == -1)
    {
    closesocket(ssocket);
    return 1;
    }
     
    msgbuffer(buffer);
     
    }
     
    }
    return 0;
    }
     
     
    int msgbuffer(char *buffer) {
     
     
    if (strstr(buffer, "PING :") != NULL && buffer[0] == 'P')
     
    {
    buffer[1] = 'O';
     
    if ((send(ssocket, buffer, strlen(buffer), 0)) == -1) {
     
    return 1;
    }
     
    if (strstr(buffer, "JOIN :You have not registered")) {
     
    sendto_("JOIN %s","#chan,#chan2"); }
    sendto_("PRIVMSG %s %s","#chan2",buffer);
     
     
    if (strstr(buffer, "ERROR :Closing Link:") != NULL && buffer[0] == 'E')
     
    {
    closesocket(ssocket);
     
    return 1;
     
    }
     
    }
     
    return 0;
    }
    c'est mieux ? et l'erreur se trouve bien sur quand la while d�marre

  6. #6
    Membre �prouv� Avatar de rakakabe
    D�veloppeur informatique
    Inscrit en
    Ao�t 2007
    Messages
    124
    D�tails du profil
    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 124
    Par d�faut
    Citation Envoy� par MickaLeOuf Voir le message
    Stp machin si vous pouviez cessez de sortir des phrases toutes faites...
    Je suis d�sol� si ma r�ponse t'as choqu�. Je vais reformuler mes phrases d'apr�s ma compr�hension du code:
    Je trouves normal si mala92 se pose la question "dans quelle partie de code c�t� serveur ?". En effet,

    - si le socket n'est pas connect� alors le serveur se bloque � l'appel de accept() en attendant la connexion d'un client. Mais comme max21 l'a fait remarqu�, cette hypoth�se est fausse;

    - comme je sais pas sur quel OS le programme fonctionne, j'ai pris le manuel de NetBSD pour select() comme documentation de r�f�rence:
    d'apr�s le manuel, lorsque le dernier param�tre de select() est NULL, alors select() se bloque ind�finiment tant que ssocket2 n'est pas pr�t pour la
    lecture (tant que le client connect� n'envoie rien au serveur selon mon interpr�tation);

    - enfin, select() pourrait envoyer une erreur si ssocket2 est d�j� ferm� avec close() (quelque chose du genre Bad File Descriptor sur errno si je me souviens bien): c'est msgbuffer() qui ne quitte pas la boucle while me fait penser � cela.

  7. #7
    Membre � l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par d�faut
    Citation Envoy� par rakakabe Voir le message
    Je suis d�sol� si ma r�ponse t'as choqu�. Je vais reformuler mes phrases d'apr�s ma compr�hension du code:
    Je trouves normal si mala92 se pose la question "dans quelle partie de code c�t� serveur ?". En effet,

    - si le socket n'est pas connect� alors le serveur se bloque � l'appel de accept() en attendant la connexion d'un client. Mais comme max21 l'a fait remarqu�, cette hypoth�se est fausse;

    - comme je sais pas sur quel OS le programme fonctionne, j'ai pris le manuel de NetBSD pour select() comme documentation de r�f�rence:
    d'apr�s le manuel, lorsque le dernier param�tre de select() est NULL, alors select() se bloque ind�finiment tant que ssocket2 n'est pas pr�t pour la
    lecture (tant que le client connect� n'envoie rien au serveur selon mon interpr�tation);

    - enfin, select() pourrait envoyer une erreur si ssocket2 est d�j� ferm� avec close() (quelque chose du genre Bad File Descriptor sur errno si je me souviens bien): c'est msgbuffer() qui ne quitte pas la boucle while me fait penser � cela.

    Merci pour ta r�ponse rakakabe , je suis sous Windows 7 et j'utilise qt creator

  8. #8
    Membre �prouv� Avatar de rakakabe
    D�veloppeur informatique
    Inscrit en
    Ao�t 2007
    Messages
    124
    D�tails du profil
    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 124
    Par d�faut
    Juste quelques remarques (par rapport au premier post):
    A la ligne 7, je comprends pas bien ce que tu veux faire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    char buffer [2048] = {0};
    Peut-�tre il y a un probl�me avec ce buffer.

    Par ailleurs essaie de v�rifier les valeurs de retour de msgbuffer() dans ta boucle while (condition de sortie de cette boucle):
    Dans les lignes 56 - 59:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    if ((send(ssocket, buffer, strlen(buffer), 0)) == -1) {
       return 1;
    }
    send() pourrait se bloquer sauf si ssocket est en mode non-bloquante,
    alors que dans les lignes 67 - 74:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    if (strstr(buffer, "ERROR :Closing Link:") != NULL && buffer[0] == 'E') {
            closesocket(ssocket);
            return 1;
    }
    closesocket() rend ssocket non valide au prochain appel de select().

    Le mieux c'est d'�x�cuter ton code par �tape pour voir o� cela plante.

  9. #9
    Membre � l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par d�faut Probleme r�solu
    Bonjour

    Je viens de trouver ; le probl�me �tait simple enfaite , l'application ne g�r� pas l'interface Qt et le socket en m�me temps , un thread a r�solu mon probl�me

    A plus

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Syst�me] probleme socket php
    Par sneb5757 dans le forum Langage
    R�ponses: 3
    Dernier message: 03/06/2007, 11h27
  2. Probleme socket requete POST
    Par killuaster dans le forum Programmation et administration syst�me
    R�ponses: 2
    Dernier message: 15/10/2006, 15h15
  3. [Syst�me] Probleme Socket Php
    Par Reaggaman dans le forum Langage
    R�ponses: 4
    Dernier message: 01/03/2006, 18h55
  4. Problemes socket
    Par Proxius dans le forum VB 6 et ant�rieur
    R�ponses: 5
    Dernier message: 27/07/2005, 14h25
  5. Probleme socket
    Par Spolix dans le forum R�seau
    R�ponses: 6
    Dernier message: 03/10/2003, 06h50

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