IPv6 和 IPv4 的套接字侦听器

Socket listener for IPv6 and IPv4

本文关键字:套接字 侦听器 IPv4 IPv6      更新时间:2023-10-16

我使用流行的教程移植了一个应用程序以支持IPv6。我决定对两种协议只使用一个套接字侦听器。现在我意识到我必须正确设置IPV6_V6ONLY(它只能在开箱即用的 x86 Linux 上运行,但不能在我的 ARM 上运行)。

这真的是要走的路吗?有人说不应该使用IPV6_V6ONLY(显然它已经过时了,因为网络上的IPv4映射),有人说两种协议都使用一个套接字是可以的。

所以,我很困惑。这个问题的现状如何?我误解了这个问题吗?

您应该始终显式绑定两个套接字,IPv6 套接字与 IPV6_V6ONLY 绑定。

为什么?跨平台兼容性。

默认情况下,Windows 要求您在 IPv4 和 IPv6 上显式绑定。仅绑定到 IPv6 也不会隐式绑定到 IPv4。

默认情况下,Linux 在 IPv6 上绑定时也会隐式绑定到 IPv4,前提是 net.ipv6.bindv6only sysctl 设置为 0 。像 Debian 这样的发行版将此默认值更改为 1 ,打破了您的假设。

我不记得Mac OS X在这里做了什么(请有人在评论中唧唧喳喳?),但关键是显式绑定到这两个协议不会留下任何惊喜。

无论哪种方式都很好。

如果显式绑定 v4 和 v6,则需要设置 IPV6_V6ONLY ,否则需要清除它。默认设置因平台而异。

某些平台不支持在 v6 套接字上接受 v4 连接,因此为了获得最大的兼容性,我会采用"两个套接字"方法。