4

问题是有两个过程:

  1. 进程 A 只知道发送。
  2. 进程 B 只知道接收。

进程 C 是已编译的二进制文件,因此无法更改。

进程 C 必须从 A 接收并发送到 B。我将进程 B 绑定到端口 X。由于进程 A 每次总是从不同的随机端口发送,而进程 C 将其应答到这些端口,进程 B 永远不会获取数据。

目前我的解决方案:

  • 绑定进程 B 监听端口 X(使用重用)
  • 绑定进程 A 从端口 X 发送(使用重用)
  • 始终先从 A 开始,然后再从 B 开始。

该解决方案有效,但不一致。

所以问题是:是否有可能从特定端口发送到 localhost UDP 数据包而不绑定到它?也许其他一些解决方案?

这是当前状态的图表:

在此处输入图像描述

4

1 回答 1

5

从单个父进程启动 A 和 B。父进程创建套接字并将其绑定到端口 X。然后它分叉,子进程继承此套接字。然后其中一个进程执行A,另一个执行B。套接字的FD可以传递给它们argv

SO_REUSEPORT不能可靠工作的原因是因为每个套接字都有自己的输入队列。当数据报到达端口时,操作系统选择其中一个套接字并将消息放入其队列中。如果它选择了 A 使用的套接字,B 将不会看到该消息。我认为没有办法告诉操作系统其中一个套接字仅用于发送,而不是接收。

使用继承的socket解决了这个问题,因为它只是一个socket,所以只有一个队列。无论哪个进程调用recv()都会收到所有消息。

于 2013-06-27T07:39:33.483 回答