2010-11-18 16 views
4

Est-ce que quelqu'un a de l'expérience avec ça? J'ai une application tordue. Les clients se connectent au serveur. J'ai ajouté une fonctionnalité de sorte que si un client se connecte à un serveur, mais qu'un client de cette adresse IP est déjà en cours d'exécution, il déconnecte le nouveau client.tordu ne détecte pas les déconnexions client

De temps en temps, j'arrête un ordinateur client (ou VM, pour être précis) sans éteindre manuellement le programme Python. Quand je fais cela, de temps en temps mais assez souvent, le serveur ne détecte aucune déconnexion. Lorsque l'ordinateur revient et tente de se reconnecter, le serveur insiste sur le fait qu'il existe déjà une connexion à partir de cette adresse IP. La seule solution que j'ai trouvé jusqu'à présent est de redémarrer le serveur.

Pourrait-il y avoir d'étranges problèmes de mise en réseau sans passer par la déconnexion? Bug tordu? Je suis sûr à 99% que ce n'est pas un bug avec mon code pour gérer les déconnexions. Mon code est configuré de telle sorte que connectionLost est appelé chaque fois qu'une connexion est perdue, y compris la plupart des cas d'arrêt d'une machine, et il enregistre une chaîne indiquant ce qui est déconnecté ou déclenche une exception si quelque chose d'étrange se produit. Aucune de ces choses n'apparaissait dans le journal.

+0

Le framework Twisted possède des événements et eventHandler est défini à tous les niveaux conceptuels - transport/connexion, protocole, etc. pour gérer une déconnexion. Donc, l'examen du code aiderait. Vous pouvez publier une version simplifiée du code qui présente ce comportement. – pyfunc

+0

@pyfunc: Je vais creuser autour du code. Je suspecte des problèmes de réseau pour l'instant, parce que j'ai fait que le client continue à essayer de se reconnecter, et dans certains cas il a pu se connecter finalement (bien que dans d'autres cas, non). – Claudiu

Répondre

5

Ceci est un Twisted FAQ, même si elle n'a pas vraiment rien à voir avec Twisted spécifiquement.

2

Heh Je ne peux pas croire que j'oublié tout ce que j'appris en classe en réseau ...

(2:09:44 PM) coworker: this is the expected behaviour 
(2:10:15 PM) coworker: the server has no way to know if someone dies, or is just quiet 
(2:10:35 PM) coworker: unless ofcourse the server has some kind of ping/keepalive message 
(2:15:38 PM) claudiu: ah so if they have no communicatin 
(2:15:42 PM) claudiu: there's no way to tell that a TCP connection has died 
(2:15:47 PM) claudiu: i remember learning that now, yes.. 
(2:16:23 PM) claudiu: but if i just make the server ping the client then it'll figure out soon enough from lack of ACKs that it's dead, right? 
(2:16:45 PM) coworker: right