无法绑定到多播地址(Windows)

4
我正在尝试编写一个应用程序,使用Windows sockets监听多个组播组。但是,当我尝试绑定套接字时,如果我尝试绑定到组播组地址和端口,则会出现WSAEADDRNOTAVAIL错误。如果我改为绑定到INADDR_ANY和端口,则仍然可以接收到其他无关的流量,该流量目的地是相同的端口。
在Linux中实现相同的功能时,我没有遇到任何绑定到多播地址的问题(事实上,我看到有几个地方建议这样做以避免获取与端口无关的流量)。
这是否意味着Windows sockets不支持此功能?我认为我可以通过使用WSARecvFrom并查看标头来自己过滤流量,但是如果有简单的解决方案,我宁愿选择它。
此外,这是在Windows Server 2008上运行的。

2
我在Windows套接字方面遇到了同样的问题。看起来Windows套接字不接受多播IP的绑定,这使得无法防止套接字在相同端口上从其他IP接收无关的流量。 - mtctn
我在这里赞同其他人的说法,在进行了相当多的调查后,我没有找到任何绑定到多播地址并防止端口上的其他流量通过的方法。 - teeks99
1个回答

2

虽然bind()的文档没有说明它不支持这个操作,但是在备注中说:

对于多播操作,首选方法是调用bind函数将套接字与本地IP地址关联,然后加入多播组...

也许这种方案会产生更好的结果?


2
是的,正如我在原始问题中提到的那样,您可以这样做,但它不能防止套接字上的recv获取端口的单播数据。到目前为止,我还没有找到解决方案,除了执行WSARecvMsg并检查数据包信息以查看真实的目标地址。 - Paul D.
抱歉,我认为使用IP_ADD_MEMBERSHIP的setsockopt()应该过滤掉套接字中所有非组数据流量,而不管绑定了哪个地址。 - ribram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接