我有一个仅支持 IPv4 的 UDP 应用程序,监听端口 624。我使用 socat 创建了一个 IPv6/IPv4 前端,监听端口 625。现在我可以使用服务器的 IPv4 或 IPv6 地址来访问仅支持 IPv4 的应用程序。到目前为止,一切都很棒!
socat UDP6-LISTEN:625,fork,su=nobody UDP4:localhost:624 &
在仅发送一条 UDP 消息(以下示例中为 IPv4)后,我看到创建了两个新的长寿命进程,网关的每一侧各一个。
# lsof -i:624 -i:625 -n -P -i:625
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
myap 4296 root 4u IPv4 7845 0t64 UDP *:624
socat 28597 nobody 3u IPv6 67603 0t64 UDP 192.168.93.90:625->192.168.90.121:34091
socat 28597 nobody 4u IPv4 67882 0t64 UDP 127.0.0.1:53648->127.0.0.1:624
你可以想象,对于一个繁忙的服务器,长寿命进程的数量会迅速增长。
我如何使用 socat 提供网关功能并让其清理这些长寿命的 UDP 进程?
答案1
我从 socat 手册页中找到了我需要的内容......
答案是针对基于 UDP 的通信设置超时。
-T<timeout>
完全不活动超时:当 socat 已处于传输循环中并且几秒钟内没有发生任何事情<timeout> [timeval]
(没有数据到达、没有发生中断......)时,它就会终止。 对于无法传输 EOF 的 UDP 等协议很有用。
因此命令行应该变成(5秒超时):
socat -T5 UDP6-LISTEN:625,fork,su=nobody UDP4:localhost:624 &
马特。