【问题标题】:UDP multicast using winsock API differences between XP and VistaXP和Vista之间使用winsock API的UDP组播差异
【发布时间】:2010-12-04 05:47:12
【问题描述】:

在 windows XP 和 windows vista 之间,设置 UDP 多播套接字所需的实现似乎有所改变。具体来说:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    非常老的问题,但是有人知道如何检查机器上存在哪个版本的winsock吗?

    我有一些旧机器仍在使用 xp 或 server 2003。 但是测试windows版本并没有帮助, 似乎有可能有一个 windows 5.1 版,它以前不接受绑定,而一台 5.2 版的机器接受它。

    【讨论】:

      【解决方案2】:

      您在调用setsockopt() 以应用IP_ADD_MEMBERSHIP 并加入多播组时遇到什么错误?

      我刚刚在这里用我的服务器框架运行了一些测试,我注意到我确实在 Windows 7 上调用了bind()(我手头没有 Vista 盒子),然后我也可以加入一个多播组只要绑定地址和多播地址都有效,就可以预期。

      但是我不能使用 INADDR_ANY 调用 bind(),因为这会导致加入多播组失败并出现错误 10022 (WSAEINVAL),并且如果多播组地址不是有效的多播地址,则调用失败错误 10049 (WSAEADDRNOTAVAIL)。这一切似乎都很公平。

      我现在正在启动一个 XP 机器...

      [在 XP 上测试后编辑]

      在 XP 上,bind()INADDR_ANY 是合法的,使用无效的多播地址也是合法的。所以,我希望,你正在做其中之一,因此它适用于 XP 而不是 Vista/Win7。

      那么,您遇到了什么错误以及您绑定到什么地址?

      【讨论】:

        【解决方案3】:

        我不知道这个具体问题,但我知道网络堆栈是从头开始为 Vista 重写的

        【讨论】:

        • 太棒了——你认为他们会对新代码进行回归测试吧?这让我很生气...... arrrrggggghhhHHH!
        猜你喜欢
        • 2011-01-16
        • 2010-12-09
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        相关资源
        最近更新 更多