繁体   English   中英

只有一个套接字接收数据。 两个UDP服务器sockets绑定到同一个端口,Windows上的不同地址

[英]Only one socket receives data. Two UDP server sockets bound to same port, different addresses on Windows

[类似问题]:

使用 UDP 的问题 sockets 绑定到 Windows 上的同一端口

处理多个 UDP sockets 侦听同一端点

这些都没有得到解决。

[情况]:

在 Microsoft Windows 上,我在同一进程中绑定了两个 UDP 服务器 sockets。 这个特殊的(不是说特殊的)操作系统只支持SO_REUSEADDR ,它不支持SO_REUSEPORT 最重要的是, SO_REUSEADDR就像SO_REUSEPORT一样。

因此,考虑到上述情况,我只剩下将套接字 A 绑定到0.0.0.0:1234 ,将套接字 B 绑定到192.168.1.1:1234 如果我要在同一台机器上重用同一端口。

也就是说,我不能将两者都绑定到同一个 IP 地址,因为 Microsoft Windows 不会同意这一点; 再一次,它支持两个 sockets 绑定到完全相同的{SRC_ADDR,DST_ADDR, SRC_PORT,DST_PORT,PROTOCOL}元组,即使在两个 sockets 上都使用了SO_REUSEADDR

因此,如果我要在同一台机器上使用同一端口,我将不得不绑定到两个不同的地址。 虽然0.0.0.0代表任意地址,但无论如何微软Windows都同意,将两个sockets绑定成这样的配置,没有报错。

UDP sockets 两个这样的配置,绑定操作成功。

问题:

现在,我无法让这些 sockets 按预期接收数据。 即,我希望两个 sockets 接收数据。 实际上,只有最先绑定的套接字才能接收数据。

有任何想法吗?

数据是否总是由与目的地最匹配的套接字接收? 如果你想知道为什么我要那样玩,那是因为我试图在同一个端口上用两个协议多路复用两个库,修改量最少。

如果您希望两个端口接收到相同的 udp 数据包,您应该为传输套接字设置选项/标志广播。 就像是:

      socket_.set_option(boost::asio::socket_base::broadcast(true));

在某些情况下(对于某些操作系统),您应该将数据包传输到广播地址而不是确切的 ip 地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM