c++ - XP和Vista之间使用winsock API的UDP组播区别

标签 c++ windows sockets windows-vista winsock

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/

相关文章:

windows - 完全迷失在 "Installing"OpenCV/ctypes-opencv for Python 3

java - 如果特定的外部程序启动,则让 Java 程序自行终止

python - 属性错误 : module 'socketserver' has no attribute 'ForkingMixIn'

c++ - 如何从特定的静态链接库生成构建产品使用的符号列表?

c++ - 计算速率参数 : exponential distribution

windows - 如何使用 ENV 变量在 Windows 中为 Kubectl 创建别名?

java - 一个ServerSocket与多个Socket之间的通信

ios - 如何在iOS中使用socket编程传输文件?

c++ - 创建一组宏来定义一个名为 RETURN_STATUS 的类型和以下值 :

C++ 重载 : overload of operator =