从特定端口发送UDP而不绑定

时间:2013-06-27 07:11:38

标签: c linux sockets udp

问题在于有两个过程:

  1. 流程A只知道发送。
  2. 流程B只知道接收。
  3. 进程C是一个已编译的二进制文件,因此无法更改。

    进程C必须从A接收并发送给B. 我将进程B绑定到端口X. 由于进程A始终从不同的随机端口发送,并且进程C将其应答到这些端口,因此进程B永远不会获取数据。

    目前我的解决方案:

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

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

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

    以下是当前状态图:

    enter image description here

1 个答案:

答案 0 :(得分:4)

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

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

使用继承的套接字解​​决了这个问题,因为它只是一个套接字,因此只有一个队列。无论哪个流程调用recv()都会获得所有消息。