2010-07-28 15 views
2

J'ai écrit une application Delphi (2009) avec Indy (TCPServer/Client). Et j'ai un problème au niveau de TCPServer: il détecte la déconnexion (après un redémarrage du PC) du Client uniquement lorsque le client tente une nouvelle fois de se reconnecter au serveur. J'ai exécuté mon application pas à pas, et lorsque le client tente une reconnexion supérieure (après le redémarrage), le serveur lève (une exception silencieuse, je pense): Connection reset by peer. Pourquoi cette exception est-elle trop tardive?Vérifiez si la connexion est fermée!

(je pense que le fil ne soit pas libéré listeuse immédiatement)

Que pensez-vous?

Répondre

3

Ceci est un détail de bas niveau du protocole TCP. Par défaut, il ne transmet pas de paquets keep-alive, car cela gaspille de la bande passante, donc il se rendra compte que la connexion est morte quand quelque chose arrive qui l'invite à vérifier la connexion. (Je ne suis pas sûr pourquoi une reconnexion du même client déclencherait cela.)

Vous pouvez faire en sorte que TCP envoie des paquets persistants pour détecter les déconnexions plus tôt. Dans Windows, cela peut être activé par l'application serveur, mais est configuré via le registre (voir here pour plus de détails).

Vous pouvez également implémenter un mécanisme de maintien au niveau du protocole en demandant au client ou au serveur d'envoyer occasionnellement des paquets nuls (un paquet qui ne fait rien en particulier). Cela nécessite évidemment que le protocole que vous utilisez définisse une sorte de message "do-nothing" ou "nothing-nothing-interesting" (NOOP, STATUS, PING ...).

+0

Avant, (il y a quelques jours), le système fonctionnait parfaitement. En utilisant l'événement OnDisconnect pof TCPServer, il indique en temps réel quand la connexion était proche, mais maintenant, sans aucun code de modification, cela ne fonctionne pas (testé sur 3 réseaux locaux)! – djiga4me

+0

En plus d'être globalement configurable dans le registre, vous pouvez également le définir pour une connexion à la fois avec ['setsockopt'] (http://msdn.microsoft.com/en-us/library/ms740476.aspx). Indy fournit un wrapper, 'GWindowsStack.SetSocketOption', dans l'unité * IdStackWindows *. –

+0

Pas travaillé sur les messages de ne rien faire du serveur. Je n'utiliserai pas le registre. – djiga4me