2016-04-12 13 views
0

I socat 1.7.3.1-r0 und läuft auf einem alpine 3.3 Server Linux folgenden Befehl verwenden:Socat nicht schließen TCP-Verbindung

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

Socat für Kunden hören und eine bidirektionale Kommunikation erstellen, indem Daten aus der virtuellen seriellen Schnittstelle /dev/ttyFOOBAR an den Client vorbei und zurück über TCP. Sobald der Client die Verbindung trennt, sollte socat beendet werden.

Wenn eine solche Verbindung socat hergestellt wird protokolliert das folgende:

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 ([email protected]) 
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({5}, {6}, {"/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, {2, AF=2 CLIENT_IP:PORT}, 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 trennen (indem es ausgeschaltet wird), ist die TCP-Verbindung immer noch hergestellt und es kommt keine zusätzliche Protokollierung von Socat hinzu. ss zeigt immer noch die Verbindung als ESTAB an. Irgendwelche Ideen warum? Wenn ich eine Verbindung wieder den Client folgend erscheint 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 diese statt disconnect on connect passiert?

+0

' socat verwendet Port 5000. 'ss' meldet etwas anderes auf Port 7000. – EJP

+0

@EJP nur ein Tippfehler. Behebt das –

+0

Sie meinen, dieser Ausgang wird nicht aus der Quelle geschnitten und eingefügt? Erzeugt kein Vertrauen. – EJP

Antwort

4

Wenn auf einem Socket keine Daten gesendet oder empfangen werden und die zugrunde liegende Verbindung abgeschnitten wird, ist keiner Seite bewusst, bis sie versucht, Daten zu senden. Normalerweise wären dies Daten auf Anwendungsebene, aber auf Protokollebene können Sie TCP-Keep-Alives aktivieren, um fließende Daten zu emulieren, wenn keine echten Daten vorhanden sind.

Nach dem socat manpage könnte man so etwas versuchen: (. keepalive sieht tatsächlich aus wie die wesentliche Option, aber es ist unklar, was die Standardeinstellungen für die Tuning-Optionen sein wird, wenn nicht gesetzt) ​​

socat -d -d -d PTY,link=/dev/ttyFOOBAR,echo=0,raw,unlink-close=0 TCP-LISTEN:7000,forever,reuseaddr,keepalive,keepidle=10,keepintvl=10,keepcnt=2 

Verwandte Themen