2009-12-15 8 views
0

J'ai créé une application de serveur client avec C++ CSocket. Lorsque je connecte le client au serveur et après que je ferme le client avec le bouton X normal ou que je le termine avec taskmanager, le serveur CSocket reçoit l'événement OnClose. Le problème est que lorsque je désactive la connexion Internet sur les fenêtres sur lesquelles le client s'exécute, le serveur CSocket ne reçoit pas l'événement OnClose ni OnReceive!CSocket ne reçoit pas OnClose ou OnReceive lorsque vous désactivez la connexion réseau côté client

Quelqu'un peut-il savoir ce qui se passe? Mise à jour: Je viens de tester et vu que le client n'a pas reçu le OnClose aussi! J'ai désactivé la connexion Internet sur les fenêtres sur lesquelles le client s'exécute!

Répondre

1

Le côté client est arrêté sans pouvoir fermer la connexion au serveur via un FIN ou RST. Pour que le serveur détecte que le client est mort, il doit soit avoir des données à envoyer (ce qui échouerait) soit envoyer des sondes keepalive TCP périodiques. TCP_KEEPALIVE peut être défini comme une option de socket.

+0

Merci, dois-je garder en vie sur le serveur et le client que vous pensez? – EBAG

+1

Dépend de ce que vous essayez de protéger contre. Si vous activez le keepalive côté serveur, cela empêchera une connexion de rester en veille au cas où le client serait arrêté comme décrit ci-dessus. Encore une fois, cela n'est nécessaire que dans le cas où le serveur n'écrit jamais sur le socket. Le keepalive du côté client a probablement moins de sens puisque probablement votre client écrit sur le socket et si une connexion client consomme des ressources, ce n'est généralement pas un gros problème. –