Was ist die Semantik des Abrufens eines EADDRINUSE, wenn kein Listening-Socket gebunden ist, aber Verbindungen geöffnet sind?

Was ist die Semantik des Abrufens eines EADDRINUSE, wenn kein Listening-Socket gebunden ist, aber Verbindungen geöffnet sind?

Stellen Sie sich einen übergeordneten Prozess vor, der einen abschließt socket/bind/acceptund untergeordnete Prozesse mit diesem Socket zur Kommunikation öffnet, während der übergeordnete Prozess weiterhin Verbindungen akzeptiert. Dieser übergeordnete Prozess wird dann beendet.

Ein anderer Prozess versucht nun, eine Bindung an die gleiche Adresse am gleichen Port herzustellen, an die der übergeordnete Prozess gebunden war, erhält jedoch einen EADDRINUSE-Fehler.

Wenn Sie diesen Vorgang jedoch mit abschließen sshd, scheint essshd Istin der Lage, die Verbindung zum geschlossenen Port wiederherzustellen, während während des Neustartfensters (in dem der übergeordnete SSHD-Prozess nicht ausgeführt wird) ein anderes Programm (das als anderer Benutzer ausgeführt wird) nur EADDRINUSE erhält.

Welche Semantik steckt dahinter? Warum ist sshdeine erneute Bindung möglich, ein anderer Benutzerprozess jedoch nicht?

Darüber hinaus kann ich bestätigen, dass die netstat -a | grep PORTAusgabe während der Zeit, in der nur der untergeordnete Prozess ausgeführt wird (wenn der andere Prozess dies nicht kann bind), die einzige Verbindung die ist ESTABLISHED, „Keine im LISTENZustand“.

Antwort1

Obwohl ich die Semantik nicht vollständig verstehe (entweder suche ich an der falschen Stelle oder die Dokumentation ist unzureichend), bin ich der Meinung, dass für eine bestimmte Zeitspanne nach dem Schließen einer Verbindung (die möglicherweise durch festgelegt wurde SO_LINGER) kein Prozess einen neuen Socket mit denselben Details öffnen kann, sofern diese nicht SO_REUSEADDRfestgelegt wurden.

Dies soll, so wie ich es verstehe, verhindern, dass sich jemand eine Sekunde nach dem Schließen einer Verbindung erneut anmeldet und der Prozess mit Paketen umgehen muss, die für den vorherigen Prozess bestimmt waren.

man 7 socketdokumentiert dies nicht, SO_REUSEADDRwas es teilweise schwierig machte, diese Antwort herauszufinden.

verwandte Informationen