我的机器上有 UDP 网络流量(确切地说是来自 iPad 的 OSC 流量),我希望两个程序能够接收该流量。问题是我不能同时用两个程序绑定到同一个网络端口,也不能用我正在使用的 iOS 应用程序发送到多个端口。我怎么解决这个问题?
问问题
242 次
3 回答
2
为此,您可以使用命令行的强大功能。以下代码段使用socat
(可能需要预先安装)和tee
(应该预安装在任何 OS X 或 Linux 上)。
socat -u UDP4-RECVFROM:8123,fork - | tee >(socat -u - UDP4-SENDTO:localhost:8223) | socat -u - UDP4-SENDTO:localhost:8323
解释:socat
侦听 UDP 端口 8123 上的流量,将其通过管道传输到tee
,将其通过管道传输到另外两个实例,分别socat
将其转发到 localhost 上的端口 8223 和 8323。使用您的两个程序,您需要在 localhost 上侦听这些端口。
于 2014-05-02T07:14:11.330 回答
0
问题是我不能同时用两个程序绑定到同一个网络端口
是的你可以。在绑定之前,只需设置SO_REUSEADDR
并可能在它们两个上。SO_REUSEPORT
于 2014-05-02T08:46:28.347 回答
0
虽然 using 的答案socat
很优雅,但我并不清楚您要做什么:
- 这两个程序都应该接收所有部分的流量,它们只会接收而不回复。这可以通过建议的
socat
方式完成 - 两个程序都应该接收所有部分的流量,并且回复将混合在一起(如何?)
- 每个程序应该只接收部分流量,例如另一个没有得到的流量。如果您的两个程序都使用 SO_REUSEADDR、SO_REUSEPORT,这应该是可能的。然后,答复将混合在一起。
- 或者您是否真的想与每个程序单独通信 - 那么您将不得不在 iOS 应用程序中使用多个套接字(您不想这样做)或构建自己的协议来进行多路复用,例如每条消息是以目标应用程序为前缀,在目标机器上,多路分解器应用程序将接收所有数据包并将它们转发到适当的应用程序,并将回复包装回多路复用协议中。
总结:请描述您要解决的问题,而不仅仅是一个小的技术细节。
于 2014-05-02T07:31:11.923 回答