【问题标题】:How to send UDP datagrams from different applications but from the same SOURCE port?如何从不同的应用程序但从同一个 SOURCE 端口发送 UDP 数据报?
【发布时间】:2020-12-29 19:05:57
【问题描述】:

我们有两个应用程序

  1. 第一个是 UDP 服务器,它使用 SOURCE 端口 (12345) 进行侦听和响应
  2. 第二个应用是只响应不监听,我们需要用指定的源端口(12345)响应

如何做到这一点?

我们正在尝试使用多种场景,但是:

  1. 我们无法在第二个应用程序中绑定套接字,因为它在第一个应用程序中使用过
  2. 我们不能在第二个应用程序中使用 SO_REUSEPORT 进行绑定,因为这个应用程序开始获取 UDP 数据而不是第一个应用程序
  3. 我们可以使用 IPC 从第二个应用程序到第一个应用程序,然后像往常一样发送 UDP (sendto),但这是一个非常庞大的解决方法

【问题讨论】:

  • 这不是(IMO)编程问题,而是设计、分析甚至需求问题。导致多个应用程序需要使用同一个端口的原始要求是什么?
  • 您不能在进程之间共享这样的端口,至少不容易。您需要一个中间的代理来处理流量,然后您可以使用 IPC 或其他 UDP 网络将它们路由到正确的目的地。或者,您可以尝试使用原始套接字来欺骗它,但我不确定这种方法会有多成功。
  • 我不想共享端口,我只想从不同的应用发送具有相同 SOURCE 端口的 UDP 数据报。
  • medium.com/uckey/… 这表明无论如何这并不容易。
  • 您系统的实际要求是什么?谁告诉你两个应用程序需要使用相同的端口?这个要求是从哪里来的?也许您需要花一些时间与您的技术主管和项目经理讨论此要求,或者甚至直接与客户交谈。

标签: c linux sockets networking udp


【解决方案1】:

一种选择是让服务器(第一个进程)将套接字文件描述符发送给发送者(第二个进程),以便它们共享相同的内核 UDP 套接字文件描述(而不是 2 个套接字绑定到同一个端口),但只有一个进程(服务器)从中读取。

您可以使用forkfork-execUnix domain sockets SCM_RIGHTS ancillary messages 将文件描述符传递给另一个进程。

【讨论】:

  • 是的,谢谢您的提示,我们也找到了这种方法,但看起来也很复杂。谢谢
  • @Dmitry 如果您的服务器使用 I/O 事件循环,那么除了 UDP 套接字之外,还应该很容易让它在 Unix 套接字上侦听。这只是微不足道的插座管道,乏味,但不是火箭科学。
  • 是的,这就是今天的工作方式。我们有带有“任何”地址监听的 UDP 服务器,第二个应用程序将 UDP 数据包发送到具有特殊签名、目标地址和内部数据的 UDP 服务器的 UDP 数据包,我们正在获取它并重新发送到指定的目标地址服务器。但是,由于额外的层,我们担心性能。
  • @Dmitry 我所描述的不需要转发/重新发送 UDP 消息。
  • 我们有两个不同的进程,所以我们需要 IPC 以某种方式将 I/O 事件从一个进程注入到另一个进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多