CLOSE_WAIT
znamená, že váš program stále běží a neuzavřel socket (a jádro na to čeká). Přidejte -p
do netstat
získat pid a pak ho zabít důrazněji (pomocí SIGKILL
V případě potřeby). Tím byste se měli zbavit CLOSE_WAIT
zásuvky. Můžete také použít ps
najít pid.
SO_REUSEADDR
je pro servery a TIME_WAIT
zásuvky, takže zde neplatí.
Zásuvky můžete násilně uzavřít pomocí ss
příkaz; ss
command je nástroj používaný k výpisu statistik soketů a zobrazuje informace podobným způsobem (ač jednodušším a rychlejším) jako netstat.
Chcete-li ukončit jakýkoli soket ve stavu CLOSE_WAIT, spusťte toto (jako root)
$ ss --tcp state CLOSE-WAIT --kill
Svou akci můžete také filtrovat
$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill
Jak popsal Crist Clark.
CLOSE_WAIT znamená, že místní konec připojení přijal aFIN z druhého konce, ale operační systém čeká, až program na místním konci skutečně uzavře své připojení.
Problém je v tom, že váš program běžící na místním počítači neuzavírá soket. Nejedná se o problém ladění TCP. Připojení může (a zcela správně) zůstat v CLOSE_WAIT navždy, zatímco program udržuje připojení otevřené.
Jakmile místní program uzavře soket, OS může poslat FIN na vzdálený konec, který vás přepne na LAST_ACK, zatímco budete čekat na ACK FIN. Po přijetí je připojení dokončeno a odpadne z tabulky připojení (pokud je váš konec v CLOSE_WAIT, ne skončí ve stavu TIME_WAIT).