如何同时支持 IPv4 和 IPv6 连接

新手上路,请多包涵

我目前正在开发一个 UDP 套接字应用程序,我需要构建支持,以便 IPV4 和 IPV6 连接可以将数据包发送到服务器。

我希望有人可以帮助我并指出正确的方向;我发现的大部分文档都不完整。如果您能指出 Winsock 和 BSD 套接字之间的任何区别,那也会很有帮助。

提前致谢!

原文由 Charles 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

最好的方法是创建一个也可以接受 IPv4 连接的 IPv6 服务器套接字。为此,请创建一个常规 IPv6 套接字, 关闭 套接字选项 IPV6_V6ONLY ,将其绑定到“任何”地址,然后开始接收。 IPv4 地址将以 IPv4 映射 格式显示为 IPv6 地址。

系统之间的主要区别在于 IPV6_V6ONLY a) 是否可用,以及 b) 默认情况下是打开还是关闭。它在 Linux 上默认关闭(即允许不使用 setsockopt 的双栈套接字),而在大多数其他系统上打开。

此外,Windows XP 上的 IPv6 堆栈不支持该选项。在这些情况下,您将需要创建两个单独的服务器套接字,并将它们放入 select 或多个线程中。

原文由 Martin v. Löwis 发布,翻译遵循 CC BY-SA 3.0 许可协议

我一直在 Windows 下玩这个,它实际上似乎是一个安全问题,如果你绑定到环回地址,那么 IPv6 套接字正确绑定到 [::1] 但映射的 IPv4 套接字绑定到 INADDR_ANY ,因此您的(据称)安全的仅限本地应用程序实际上已向世界公开。

原文由 Dave 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题