Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    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
    Points : 1
    Points
    1

    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 :
    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
    Expert Confirmé
    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
    Points : 2 570
    Points
    2 570

    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 habitué Avatar de rakakabe
    Développeur informatique
    Inscrit en
    août 2007
    Messages
    122
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2007
    Messages : 122
    Points : 144
    Points
    144

    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
    Invité de passage
    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
    Points : 1
    Points
    1

    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
    Invité de passage
    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
    Points : 1
    Points
    1

    Par défaut

    Code :
    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 habitué Avatar de rakakabe
    Développeur informatique
    Inscrit en
    août 2007
    Messages
    122
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2007
    Messages : 122
    Points : 144
    Points
    144

    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
    Invité de passage
    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
    Points : 1
    Points
    1

    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 habitué Avatar de rakakabe
    Développeur informatique
    Inscrit en
    août 2007
    Messages
    122
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2007
    Messages : 122
    Points : 144
    Points
    144

    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 :
    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 :
    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 :
    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
    Invité de passage
    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
    Points : 1
    Points
    1

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •