5

似乎是在 windows XP 和 windows vista 之间设置 UDP 多播套接字所需的实现发生了变化。具体来说:

  • 在 Windows XP 下,您必须先调用bind(),然后才能引用任何特定于多播的套接字选项。

  • 但是在windows vista下,处理多播套接字时一定不能调用。bind()

这两点中的任何一个失败都会导致运行时出现套接字错误。

我要疯了,还是其他人也看到了?有比 bind() 调用的条件编译更好的解决方案吗?

4

3 回答 3

5

setsockopt()您从申请IP_ADD_MEMBERSHIP和加入多播组的调用中得到什么错误?

我刚刚在这里用我的服务器框架运行了一些测试,我注意到bind()我确实在 Windows 7 上调用(我手头没有 Vista 盒子),然后我也可以按预期加入多播组,只要两者绑定地址和组播地址有效。

但是我不能用 调用 bind() INADDR_ANY,因为这会导致加入多播组失败并出现错误 10022 ( WSAEINVAL),如果多播组地址不是有效的多播地址,则调用失败并出现错误 10049 ( WSAEADDRNOTAVAIL)。这一切似乎都很公平。

我现在正在启动一个XP盒子......

[在 XP 上测试后编辑]

在 XP 上,使用无效的多播地址是合法的,并且是合法的bind()INADDR_ANY所以,我希望,你正在做其中之一,因此它适用于 XP 而不是 Vista/Win7。

那么,您遇到了什么错误以及您绑定到什么地址?

于 2009-10-06T15:18:53.053 回答
1

我不知道这个具体问题,但我知道网络堆栈是从头开始为 Vista 重写的

于 2009-10-06T14:58:31.933 回答
0

非常老的问题,但是有人知道如何检查机器上存在哪个版本的winsock吗?

我有一些旧机器仍在使用 xp 或 server 2003。但是测试 windows 版本并没有帮助,似乎有可能有一个 windows 版本 5.1,它以前不接受绑定,而一台机器有 5.2 版本接受它.

于 2015-07-02T10:16:32.673 回答