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