2010-05-01 8 views
1

Je travaille actuellement sur un serveur. Je sais que le côté client fonctionne (je peux me connecter à www.google.com sur le port 80, par exemple), mais le serveur ne fonctionne pas correctement. Le socket a socket() ed, bind() ed et listen() ed avec succès et est sur une boucle d'acceptation. Le seul problème est que accept() ne semble pas fonctionner. netstat montre que la connexion au serveur fonctionne correctement, car elle affiche le PID du processus serveur comme étant LISTENING sur le port correct. Cependant, n'accepte jamais les retours. Accepter ne cesse de fonctionner, et en cours d'exécution, et si j'essaie de me connecter au port sur localhost, je reçois un 10061 WSACONNREFUSED. J'ai essayé de boucler la connexion, et ça continue de refuser les connexions jusqu'à ce que j'appuie sur ctrl + c. Je mets un point d'arrêt directement après l'appel de accept(), et peu importe combien de fois j'essaie de me connecter à ce port, le point d'arrêt ne se déclenche jamais. Pourquoi n'accepte-t-il pas les connexions? Pourquoi? Quelqu'un d'autre a-t-il déjà eu ce problème?WSACONNREFUSED lors de la connexion au serveur

connu:

[breakpoint0] 
if ((new_fd = accept(sockint, NULL, NULL)) == -1) { 
    throw netlib::error("Accept Error"); //netlib::error : public std::exception 
} 
else { 
    [breakpoint1] 
    code...; 
} 

breakpoint0 est atteint (et continue à travers), sans exception est levée, et breakpoint1 est jamais atteint. Le code client a fait ses preuves. Netstat montre que le socket écoute.

Si cela signifie quelque chose, je me connecte à 127.0.0.1 sur le port 5842 (nombre aléatoire). Le serveur est configuré pour fonctionner sur 5842, et netstat confirme que le port est correct.

+0

Avez-vous fait une exception pour ce numéro de port sur le pare-feu? –

+0

Le programme ne fonctionne pas même lorsque j'ai désactivé le pare-feu. –

+0

Exécution de quelque chose comme Wireshark sur la machine serveur, pouvez-vous voir les paquets SYN du côté client, en essayant de faire la connexion? Pouvez-vous voir, sur la machine client, les paquets SYN qui sortent? –

Répondre

0

Vous pouvez essayer d'utiliser select et voir si celui-ci se déclenche. Parce qu'il semble que n'accepte jamais aucune connexion:

fd_set mySet; 
FD_ZERO(&mySet); 
FD_SET(sockint, &mySet); 
timeval zero = { 0, 0 }; 
int sel = select(0, &mySet, NULL, NULL, &zero); 
if (FD_ISSET(sockint, &mySet)){ 
    // you have a new caller 
    SOCKET newSocket = accept(sockint, NULL, NULL); 
} 
else{ 
    // still waiting 
    <print>("Still waiting for connection.."); // whatever printfunction you use.. 
}