python-socket bleibt CLOSE_WAIT
ich habe eine Anwendung, die hören auf sockets. diese Anwendung ist die überwachung durch nagios. das problem ist, dass nagios die sockets öffnet und schließt diese direkt an.Meine Anwendung sockets Aufenthalte in CLOSE_WAIT. Und ich verstehe nicht, warum dies geschieht. Es sollte in einen Fehler und killen den sockel.
while request=="":
try:
request = self.client.recv ( 1024 ).rstrip()
except socket.timeout, msg:
log.error( "no request")
self.client.close()
return
except socket.error, msg:
print msg
self.client.close()
return
except msg:
log.error(msg)
self.client.close()
return
Irgendwelche Ideen, wie zu erwischen, richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
CLOSE_WAIT
Zustand bedeutet, dass der socket wird erwartet, dass durch die Anwendung geschlossen.In dem code, den Sie geschrieben, die Buchse ist nur geschlossen Ausnahme. Stellen Sie sicher, dass Sie in der Nähe der Steckdose, wenn es erhält
EOF
, d.h. check fürnot request
vor Strippen es.Wenn die Verbindung ordnungsgemäß geschlossen durch remote-Seite den standard-BSD -
recv
Aufruf gibt null zurück. In Python, ist der zurückgegebene Wert übersetzt zu leeren string. In beiden Fällen ist es nicht als ein Fehler, so dass Sie sollten nicht erwarten, dass alle Ausnahmen.Deinem code sagen kann:
Können Sie auch die Verbindung zu schließen, in
finally
block nach Ihrertry-except
Blöcke zu vermeiden code-Duplikation. Wenn Sie erwarten, dass der server die Verbindung schließen, nachdem das senden der Daten, könnte man Ausdrücken, wie folgt:verwenden Sie die
gevent-websockets
Bibliothek?hatten wir auch dieses problem, und hat einen lokalen patch Recht vor
self.stream = None
, die es fest für uns.btw Aufruf
close()
auf dem sockel war nicht genug. aus python docs: (https://docs.python.org/2/library/socket.html)Hinweis: es ist ein Kommentar in diese Methode:
also, ob diese "richtig" ist oder nicht ist diskutabel, aber EOD es gelöst für uns.