从特定端口发送 UDP 无需绑定

Mis*_*sha 3 c sockets linux udp

问题是有两个过程:

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

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

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

目前我的解决方案:

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

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

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

这是当前状态的图表:

在此处输入图片说明

Bar*_*mar 5

从单个父进程启动 A 和 B。父进程创建套接字并绑定到端口X,然后fork,子进程继承这个套接字。然后其中一个进程执行 A,另一个执行 B。套接字的 FD 可以在argv.

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

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