Wir haben ein Programm, das auf einem Port lauscht, um Informationen zum Ausführen eines Berichts zu erhalten. Beim Schließen und erneuten Öffnen des Programms erhalten wir eine Fehlermeldung, dass der verwendete Port bereits verwendet wird. Wenn wir uns ansehen, netstat
sehen wir, dass sich 9 Instanzen dieses Ports im Status CLOSE_WAIT und 1 Instanz im Lauschen-Status befinden. Die Instanz im Lauschen-Status sagt, dass sie PID 488 gehört. Der Task-Manager zeigt, dass es keinen Prozess mit dieser ID gibt und taskkill
sagt dasselbe. Die App ist eine interne .NET-Anwendung.
Dies ist eine Produktionsumgebung, daher möchten wir einen Neustart der Maschine vermeiden. Was könnte die Ursache dafür sein und was kann getan werden, um das Problem zu beheben?
Antwort1
CLOSE_WAIT bedeutet, dass der Socket ein FIN-Paket vom anderen Ende empfangen hat und darauf wartet, von der Anwendung geschlossen zu werden, die diesen Listening-Socket besitzt. Wenn Sie close() für einen Listening-Socket nicht aufrufen, kann es passieren, dass dieser herumschwebt, wie es bei Ihnen der Fall war.
Da es sich um eine interne .NET-Anwendung handelt, würde ich Ihren Quellcode noch einmal überprüfen, um sicherzustellen, dass der Socket vor dem Beenden ordnungsgemäß geschlossen wird.
Weitere Informationen zu Socket-Zuständen, einschließlich CLOSE_WAIT: http://blogs.technet.com/b/janelewis/archive/2010/03/09/explaining-close-wait.aspx