如何使用 keepalive 选项保持 socat 处于活动状态

如何使用 keepalive 选项保持 socat 处于活动状态

我有这个运行良好的 socat 命令,但是当没有数据传输时,它会在 5 分钟后死机,我不明白为什么,因为我已将其设置为在前 10 秒后每 10 秒发送 100 个 keepalive。根据我对 socat 手册页的理解,这应该可以让它保持活动状态 1000 秒,也就是 16 分钟。此外,如果我尝试将 keepcnt 设置为 200,我会得到“setsockopt(7, 6, 6, {200}, 4): 无效参数”,但在互联网上我找不到该参数的最大值,所以我想我一定是错过了一些非常明显的东西。对参数进行更多试验从未改变 5mn 的超时值。设置较低的 keepcnt 值和较高的 keepintvl 值是可以接受的,但没有明显的效果。

socat -d -d -d -v pty,link=/tmp/lp1 tcp:192.168.0.5:9100,reuseaddr,keepalive,keepidle=10,keepintvl=10,keepcnt=100
2017/05/31 08:53:01 socat[16065] I 本产品包含由 OpenSSL 项目开发的用于 OpenSSL 工具包的软件。(http://www.openssl.org/)
2017/05/31 08:53:01 socat[16065] I 本产品包含由 Tim Hudson 编写的软件([电子邮件保护]
2017/05/31 08:53:01 socat[16065] 我将选项“符号链接”设置为“/tmp/lp1”
2017/05/31 08:53:01 socat[16065] 我 openpty({5}, {6}, {"/dev/pts/1"},,) -> 0
2017/05/31 08:53:01 socat[16065] N PTY 是 /dev/pts/1
2017/05/31 08:53:01 socat[16065] 我将选项“so-keepalive”设置为 1
2017/05/31 08:53:01 socat[16065] 我将选项“tcp-keepidle”设置为 10
2017/05/31 08:53:01 socat[16065] 我将选项“tcp-keepintvl”设置为 10
2017/05/31 08:53:01 socat[16065] 我将选项“tcp-keepcnt”设置为 100
2017/05/31 08:53:01 socat[16065] N 打开与 AF=2 192.168.0.5:9100 的连接
2017/05/31 08:53:01 socat[16065] 我开始连接循环
2017/05/31 08:53:01 socat[16065] I 套接字(2, 1, 6) -> 7
2017/05/31 08:53:01 socat[16065] N 从本地地址 AF=2 192.168.0.4:56482 成功连接
2017/05/31 08:53:01 socat[16065] 我解析并打开了所有sock地址
2017/05/31 08:53:01 socat[16065] N 使用 FD [5,5] 和 [7,7] 启动数据传输循环
2017/05/31 08:58:01 socat[16065] N 套接字 2 (fd 7) 位于 EOF
2017/05/31 08:58:02 socat[16065] I轮询超时(0.500000秒内无数据)
2017/05/31 08:58:02 socat[16065] 我关闭(5)
2017/05/31 08:58:02 socat[16065] 我关闭(7, 2)
2017/05/31 08:58:02 socat[16065] N 退出,状态为 0

答案1

来自socat 手册页为了-t<timeout>

当一个通道达到EOF时,另一个通道的写入部分将被关闭。

尝试添加ignoreeof选项。

答案2

OPENSSL-LISTEN如果您使用诸如、TCP-LISTEN等LISTEN 命令,该fork选项将会分离与子进程的连接,以便 socat 可以继续接收。

例子:

socat - OPENSSL-LISTEN:443,method=TLS1.2,verify=0,cert=cert.pem,key=key.pem,fork

谢谢:https://unix.stackexchange.com/a/283289/15954

相关内容