Socat schließt die TCP-Verbindung nicht

2311
Lost in OWL

Ich benutze socat 1.7.3.1-r0folgenden Befehl auf einem alpine 3.3Linux-Server:

socat -d -d -d PTY,link=/dev/ttyFOOBAR,echo=0,raw,unlink-close=0 TCP-LISTEN:7000,forever,reuseaddr 

Socathört auf Clients und erstellt eine bidirektionale Kommunikation, indem Daten vom virtuellen seriellen Port /dev/ttyFOOBARan den Client und wieder zurück über TCP übertragen werden. Sobald der Client die Verbindung getrennt hat, socatsollte er beendet werden.

Wenn eine solche Verbindung hergestellt wird, protokolliert Socat Folgendes:

I socat by Gerhard Rieger - see www.dest-unreach.org I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/) I This product includes software written by Tim Hudson (tjh@cryptsoft.com) I setting option "symbolic-link" to "/dev/ttyFOOBAR" I setting option "echo" to 0 I setting option "raw" I setting option "unlink-close" to 0 I openpty(,, {"/dev/pts/3"},,) -> 0 N PTY is /dev/pts/3 I setting option "forever" to 1 I setting option "so-reuseaddr" to 1 I socket(2, 1, 6) -> 7 I starting accept loop N listening on AF=2 0.0.0.0:7000 I accept(7,, 16) -> 8 N accepting connection from AF=2 CLIENT_IP:PORT on AF=2 172.20.0.2:7000 I permitting connection from AF=2 CLIENT_IP:PORT I close(7) I resolved and opened all sock addresses N starting data transfer loop with FDs [5,5] and [8,8] 

ss Befehl auf dem Server druckt:

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port  tcp ESTAB 0 0 172.20.0.2:7000 CLIENT_IP:PORT 

Das Problem ist, dass wenn ich den Client trenne (durch Ausschalten), die TCP-Verbindung noch besteht und keine zusätzliche Protokollierung von socat erfolgt. sszeigt immer noch die Verbindung als ESTAB. Irgendwelche Ideen warum? Wenn ich mich wieder verbinde, erscheint der Client in den Protokollen:

W read(8, 0x7fa8f48c4020, 8192): Connection reset by peer N socket 2 to socket 1 is in error N socket 2 (fd 8) is at EOF I poll timed out (no data within 0.500000 seconds) I close(5) I shutdown(8, 2) I shutdown(8, 2): Socket not connected N exiting with status 0 

Aber warum passiert dies beim Verbinden, anstatt die Verbindung zu trennen?

0

1 Antwort auf die Frage

1
David Schwartz

Wenn Sie den Client ausschalten, hat er keine Möglichkeit, der anderen Seite mitzuteilen, dass er weggeht. Der einzige Weg, um zu sagen, dass der Peer verschwunden ist, besteht darin, zu versuchen, ihm etwas zu senden und zu bemerken, dass er nicht antwortet.

Wenn es in Ihrer Anwendung erforderlich ist, dass ein Dead Peer erkannt wird, müssen Sie die Dead Peer-Erkennung implementieren. Sie können dies tun, indem Sie die keepaliveOption aktivieren socat, aber es kann noch einige Stunden dauern, bis ein toter Peer erkannt wird. Sie können dies auch tun, indem Sie regelmäßig etwas senden. Das Senden wird unterbrochen, wenn der Peer tot ist, wodurch die Erkennung ausgelöst wird. Wenn auf der anderen Seite Daten an Sie gesendet werden sollen, können Sie den Vorgang abbrechen, wenn Sie die erwarteten Daten nicht erhalten haben (möglicherweise mit socatder Markierung 's' -T).