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