2016-04-12 3 views
0

Я использую socat 1.7.3.1-r0 и запустить следующую команду на сервере alpine 3.3 Linux:SOCAT не закрывает соединение TCP

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

Socat будет слушать клиентов и создать двустороннюю связь посредством передачи данных из виртуального последовательного порта /dev/ttyFOOBAR клиенту и обратно по TCP. Как только клиент отключится, socat должен выйти.

Когда такое соединение установлено SOCAT входит следующее:

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 команды на сервере принтами:

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

Проблема в том, что при отсоединении клиента (отключив его), tcp-соединение все еще установлено, и регистрация не происходит из socat. ss все еще показывает соединение как ESTAB. Любые идеи почему? Когда я снова подключаю клиент, следующий в журналах:

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 

Но почему это происходит при подключении вместо отключения?

+0

' socat' использует порт 5000. 'ss' сообщает что-то еще на порту 7000. – EJP

+0

@EJP просто опечатка. Исправлено: –

+0

Вы имеете в виду, что этот выход не вырезается и не вставлен из источника? Не внушает доверия. – EJP

ответ

4

Если нет данных для отправки или получения на сокете, и вы разрезаете базовое соединение, ни одна из сторон не знает, пока не попытается отправить данные. Обычно это будут данные уровня приложения, но на уровне протокола вы можете включить поддержку TCP-авитами для эмуляции текущих данных всякий раз, когда нет реальных данных.

Согласно socat manpage вы могли бы попробовать что-то вроде: (. keepalive на самом деле выглядит как существенный вариант, но не ясно, что по умолчанию будет для параметров настройки, если это не установлено)

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 

Смежные вопросы