【问题标题】:Identical bound port UDP sockets and receiving data on all of them相同的绑定端口 UDP 套接字并在所有这些套接字上接收数据
【发布时间】:2017-09-15 15:15:00
【问题描述】:

我需要做一个重要的测试。测试条件如下。

我正在使用 winsock,并且我有 2 个带有 SO_REUSEADDR 选项的 UDP 套接字(Sock-A 和 Sock-B),它们都已绑定到一台 PC 上的端口 1000。 它们都将 UDP 数据包发送到另一个套接字(Sock-C),位于不同 LAN 的 Sock-C 接收它们的消息。

Sock-C 用一些消息回应他们,但不幸的是,我可以看到只有 Sock-A(它已更早打开)才收到消息,而 Sock-B 什么也没收到。当我关闭 Sock-A 时,我可以看到 Sock-B 开始接收消息。

你们有谁知道我应该怎么做才能让 Sock-A 和 Sock-B 都能接收到来自 Sock-C 的消息?

谢谢~

【问题讨论】:

  • 在 WinSock 中是否提供 SO_REUSEADDR?您是否正在检查 setsockopt 的返回值? msdn.microsoft.com/en-us/library/windows/desktop/…
  • 为什么要使用同一个端口——xyproblem.info
  • 是的,可以使用 SO_REUSEADDR 选项将同一个端口绑定到两个不同的套接字。
  • 我需要使用相同端口的原因是,我有一个带有 UDP 侦听器的 Voip 软件来接收音频数据包。此应用程序已关闭,我无法更改它。我需要从不同 NAT 后面的某个地方向该软件发送音频数据包。为了处理这些对等点的 P2P 连接,我需要在同一主机上绑定一个与 voip 软件相同的 UDP 套接字,并将 UDP 数据包发送到音频数据包的来源。然后 NAT 没有端口转发和 STUN/TURN 和 ... 将数据包路由到 Voip 软件。
  • 我很抱歉,但我无法用所提供的解释来想象您要做什么

标签: c sockets udp bind winsock


【解决方案1】:

这是正常行为。我认为这不能通过 2 个侦听同一端口的套接字来完成。

为什么要将 2 个套接字绑定到同一个端口?

阅读Socket options SO_REUSEADDR and SO_REUSEPORT, how do they differ? Do they mean the same across all major operating systems?

在 linux 中,它甚至会尝试在 2 个套接字之间平均分配数据报,因此它是随机的。您将需要更改发送/接收数据包的方式。

【讨论】:

  • 当两个 UDP 套接字绑定到同一个端口并且在该端口上接收到传入的单播数据包时,它将被交给两个套接字之一(任意选择)。如果传入的数据包是多播 UDP 数据包,OTOH,它将被交给绑定到端口的每个套接字。 (后一种行为是必要的,以允许同一主机上的多个程序同时收听同一个多播组)
  • 好点。我没有包括它,因为 op 没有提到使用多播。
  • 谢谢大家,那么我该如何处理这个问题呢?由于我是通过互联网发送数据包,我可以在多播模式下发送它们吗?
  • 这取决于由于 VoIP 是封闭软件,因此必须支持侦听多播地址。发送不需要加入多播组,但接收需要加入组。
猜你喜欢
  • 2015-11-28
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多