似乎是在Windows XP和Windows Vista之间设置UDP多播套接字所需的实现已经改变。具体做法是:
在Windows XP下,必须调用bind()
才能引用任何特定于多播的套接字选项。
但是,在windows vista下,在处理多播套接字时不得调用bind()
。
这两个点中的任何一个失败都会导致运行时出现套接字错误。
我是疯了,还是有其他人也看过这个?有没有比bind()调用的条件编译更好的解决方案?
答案 0 :(得分:5)
您从应用setsockopt()
并加入多播群组的IP_ADD_MEMBERSHIP
来电中收到了什么错误?
我刚刚使用我的服务器框架运行了一些测试,我注意到我在Windows 7上调用了bind()
(我没有Vista盒子),然后我也可以加入多播只要绑定地址和多播地址都有效,就可以按预期进行分组。
但是我无法使用INADDR_ANY
调用bind(),因为这会导致多播组的加入失败,错误为10022(WSAEINVAL
),并且组播组地址不是有效的多播地址调用失败,错误10049(WSAEADDRNOTAVAIL
)。这一切看起来都很公平。
我现在正在启动一个XP盒子......
[在XP上测试后编辑]
在XP上bind()
到INADDR_ANY
是合法的,使用无效的多播地址是合法的。所以,我希望,你正在做其中的一个,因此它适用于XP,而不适用于Vista / Win7。
那么,你得到了什么错误以及你绑定的地址是什么?
答案 1 :(得分:1)
我不知道这个具体问题,但我知道网络堆栈是从头开始重写的Vista
答案 2 :(得分:0)
很老的问题,但有人知道如何检查机器上存在哪个版本的winsock?
我有一些旧机器仍在使用xp或server 2003。 但测试Windows版本没有帮助, 似乎有可能有一个Windows版本5.1,它不接受之前的绑定,以及一台5.2版本接受它的机器。