Socat未关闭tcp连接

2024-04-13

I use socat 1.7.3.1-r0并在alpine 3.3linux服务器:

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] /cdn-cgi/l/email-protection)
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

但为什么会在连接而不是断开连接时发生这种情况呢?


如果套接字上没有要发送或接收的数据,并且您切断了底层连接,则双方在尝试发送数据之前都不会意识到。通常,这将是应用程序级别的数据,但在协议级别,您可以启用 TCP 保持活动以在没有实际数据时模拟流动数据。

根据索卡特联机帮助页 http://www.dest-unreach.org/socat/doc/socat.html你可以尝试这样的事情:

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

(keepalive实际上看起来像是基本选项,但不清楚如果未设置,调整选项的默认值是什么。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socat未关闭tcp连接 的相关文章

随机推荐