【问题标题】:Socat terminates after connection closeSocat在连接关闭后终止
【发布时间】:2015-01-19 19:56:14
【问题描述】:

此命令(串行端口重定向器)接受 TCP:11313 上的单个连接:

socat PTY,link=/dev/ttyV1,echo=0,raw,unlink-close=0 TCP-LISTEN:11313,forever,reuseaddr

但是当连接丢失时,上述socat进程被杀死,客户端无法连接。

我可以通过在上述命令末尾添加fork 选项来解决这个问题。但是随后多个客户端将能够连接。但我只想接受一个连接。

任何想法如何实现这一目标?

【问题讨论】:

  • 可能 ser2net (ser2net.sourceforge.net) 是你需要的?
  • @Maquefel 你有使用 ser2net 的经验吗?对我来说,看起来他们正在做同样的事情。
  • 我有 - ser2net 是一种特殊的东西,它不能像 socat 那样做大多数事情,它专门设计用于将串行转发到以太网。但它的行为完全符合您的要求 - 一个端口 - 一个连接,连接关闭时不会退出,并通知新的传入连接有关正在使用的端口。
  • @Maquefel 我要去看看这个,谢谢!

标签: linux socat


【解决方案1】:

您可以使用max-children 选项限制子节点的数量:

LISTEN 选项组,特定于侦听套接字的选项

最大儿童= 限制并发子进程的数量 [int]。 默认无限制。

这样,您可以将可以与 PTY 交互的客户端数量限制为一个,但不会阻止其他客户端连接。其他人将简单地排队,直到第一个连接关闭。如果您想防止这种情况发生,我建议将 socat 调用包装在 while true; do ..; done 循环中:

while true; do
  socat PTY,link=/dev/ttyV1,echo=0,raw,unlink-close=0 TCP-LISTEN:11313,forever,reuseaddr
done

【讨论】:

  • 最好使用while sleep 1; do .. ; done loop,因为某些shell无法正确处理此循环中的SIGINT信号,您可能无法正确中断循环
  • 是的。我用确切的命令更新了答案。 sn-p 在无限循环中运行 socat,只要它退出就会立即重新启动它。如果您从未与他们合作过,请考虑 Gabor 的提示,并将 true 替换为 sleep 1 作为初学者。
  • 您还可以添加backlog=0 以防止新连接在已有连接时排队。不过需要注意的是:这似乎可以防止 complete 连接排队,但是(与 listen(2) 建议的相反)不会返回“连接被拒绝”,而只是让新客户端等待连接完成(即等待 SYNACK,我怀疑),导致它们最终超时。不完全完美,但它确实确保其他连接实际上不会成功(至少直到第一个连接终止)。
  • 嗯,backlog 选项中似乎有一种“off-by-one”,指定 backlog=0 将允许 one 附加连接成功,等待第一个连接终止(backlog=1 允许 two 成功)。不确定这是否是 Linux listen(2) 的工作方式,还是 socat 中的工作方式,但它确实使 backlog 选项在这种情况下无用。
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 2019-12-11
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
相关资源
最近更新 更多