Windows XP 和 windows vista 之间设置 UDP 多播套接字所需的实现似乎有所不同。具体来说:
在 Windows XP 下,您必须调用
bind()
,然后才能引用任何特定于多播的套接字选项。但是,在 windows vista 下,您不得在处理多播套接字时调用
bind()
。
这两点中的任何一个失败都会导致运行时出现套接字错误。
我是不是疯了,还是其他人也看到了?有没有比 bind() 调用的条件编译更好的解决方案?
最佳答案
在应用 IP_ADD_MEMBERSHIP
并加入多播组时调用 setsockopt()
会出现什么错误?
我刚刚在这里用我的服务器框架运行了一些测试,我注意到我确实在 Windows 7 上调用了 bind()
(我手头没有 Vista 机器),我可以然后只要绑定(bind)地址和多播地址都有效,也可以按预期加入多播组。
但是我无法使用 INADDR_ANY
调用 bind(),因为这会导致加入多播组失败并出现错误 10022 (WSAEINVAL
),并且如果多播组地址不是有效的多播地址调用失败并出现错误 10049 (WSAEADDRNOTAVAIL
)。这一切似乎都很公平。
我现在正在启动一个 XP 机器......
[在 XP 上测试后编辑]
在 XP 上,bind()
到 INADDR_ANY
是合法的,使用无效的多播地址也是合法的。所以,我想,你正在做其中之一,因此它适用于 XP 而不是 Vista/Win7。
那么,您遇到了什么错误以及您绑定(bind)到哪个地址?
关于c++ - XP和Vista之间使用winsock API的UDP组播区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1524946/