Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > Visual C++ > C++/CLI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/11/2012, 11h34   #1
max21
Invité de passage
 
Homme
Inscription : 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
max21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 08h32   #2
mala92
Expert Confirmé
 
Homme
Développeur informatique
Inscription : décembre 2011
Messages : 1 250
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2011
Messages : 1 250
Points : 2 524
Points : 2 524
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)
mala92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 08h49   #3
rakakabe
Membre habitué
 
Avatar de rakakabe
 
Développeur informatique
Inscription : août 2007
Messages : 121
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2007
Messages : 121
Points : 133
Points : 133
Envoyer un message via Yahoo à rakakabe
+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().
rakakabe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 16h44   #4
max21
Invité de passage
 
Homme
Inscription : 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
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
max21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2012, 21h04   #5
max21
Invité de passage
 
Homme
Inscription : 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
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
max21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 08h40   #6
rakakabe
Membre habitué
 
Avatar de rakakabe
 
Développeur informatique
Inscription : août 2007
Messages : 121
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2007
Messages : 121
Points : 133
Points : 133
Envoyer un message via Yahoo à rakakabe
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.
rakakabe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 10h50   #7
max21
Invité de passage
 
Homme
Inscription : 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
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
max21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 11h47   #8
rakakabe
Membre habitué
 
Avatar de rakakabe
 
Développeur informatique
Inscription : août 2007
Messages : 121
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2007
Messages : 121
Points : 133
Points : 133
Envoyer un message via Yahoo à rakakabe
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.
rakakabe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 10h41   #9
max21
Invité de passage
 
Homme
Inscription : 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
max21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h08.


 
 
 
 
Partenaires

Hébergement Web