问题在于有两个过程:
进程C是一个已编译的二进制文件,因此无法更改。
进程C必须从A接收并发送给B. 我将进程B绑定到端口X. 由于进程A始终从不同的随机端口发送,并且进程C将其应答到这些端口,因此进程B永远不会获取数据。
目前我的解决方案:
此解决方案有效,但不一致。
所以问题是: 是否有可能从特定端口发送到localhost UDP数据包而不绑定它? 也许其他一些解决方案?
以下是当前状态图:
答案 0 :(得分:4)
从单个父进程启动A和B.父进程创建套接字并将其绑定到端口X.然后它会分叉,子进程继承此套接字。其中一个进程然后执行A,另一个进程执行B.套接字的FD可以在argv
中传递给它们。
SO_REUSEPORT
无法可靠运行的原因是因为每个套接字都有自己的输入队列。当数据报到达端口时,操作系统会选择其中一个套接字并将消息放入其队列中。如果它选择A使用的套接字,B将不会看到该消息。我认为没有办法告诉操作系统其中一个插座仅用于发送而不是接收。
使用继承的套接字解决了这个问题,因为它只是一个套接字,因此只有一个队列。无论哪个流程调用recv()
都会获得所有消息。