过去在测试某些多播连接时,我一直使用 socat 来执行此操作:
socat -u UDP4-RECVFROM:12345,add-membership=224.1.2.3:eth0,fork,reuseaddr,readbytes=32 SYSTEM:"hexdump -C"
然后当我看到一些数据包或一两秒后我什么也看不到时,按 ctrl-c。
现在,当必须对数百个多播地址执行此操作时,尤其是当其中一些地址每秒发送数万个数据包时(负载比我按下 ctrl-c 快 5000),这显然变得不切实际。
如何限制socat只接收一个数据包然后退出?另外,如何设置未收到任何内容的超时(我尝试了 -T 参数,但似乎没有任何效果)
答案1
socat cmdline 开关 -T 似乎仅适用于 UDP4-RECV: 而不适用于 UDP4-RECVFROM:。但对于 UDP4-RECV 来说,它,fork
不起作用,您需要在第一个数据包后停止它。
这给您留下了以下可能性:
socat -u udp-recvfrom:8500,add-membership=224.1.2.3:eno1,readbytes=32,fork SYSTEM:"hexdump -C && kill 0" & pid=$!; sleep 10;kill $pid
如果,fork
将为每个 udp 数据包启动一个新进程,则将SYSTEM:"hexdump -C && kill 0"
在该数据包之后终止 socat 进程组。我readbytes=32
留在那里是因为你在原来的命令行中有它,所以它最多会读取一个数据包的 32 个字节。
如果没有数据包到达的超时部分有点棘手,我没有很好的解决方案,因为我们需要后台、socat、睡眠,然后杀死 socat。
如果收到数据包,kill $pid 将不再明显地找到该进程,并且会收到错误。这可以通过检查它是否还活着来解决。
无论如何,这应该有效。