使用XP和Vista之间的winsock API差异进行UDP多播

时间:2009-10-06 11:05:03

标签: c++ windows sockets windows-vista winsock

似乎是在Windows XP和Windows Vista之间设置UDP多播套接字所需的实现已经改变。具体做法是:

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

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

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

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

3 个答案:

答案 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版本接受它的机器。