p
u
b
l
i
c
i
t
é
publicité

Discussion: Probleme socket c++

  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 : 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
    Expert Confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2011
    Messages
    1 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 256
    Points : 2 577
    Points
    2 577

    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 actif 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
    Points : 154
    Points
    154

    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 : 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 actif 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
    Points : 154
    Points
    154

    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 actif 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
    Points : 154
    Points
    154

    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
    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.

Discussions similaires

  1. [Système] probleme socket php
    Par sneb5757 dans le forum Fonctions
    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 Fonctions
    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