IPv6和IPv4的套接字侦听器

时间:2013-12-18 12:00:37

标签: c++ sockets ipv6 ipv4

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

这真的是要走的路吗?有人说不应该使用IPV6_V6ONLY(显然它已经过时了,因为通过线路进行IPv4映射),有人说使用一个套接字就可以了。“/ / p>

所以,我很困惑。这个问题的当前状态是什么?我误解了这个问题吗?

2 个答案:

答案 0 :(得分:4)

您应该始终显式绑定两个套接字,并使用IPV6_V6ONLY绑定的IPv6套接字。

为什么呢?跨平台兼容性。

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

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

我不记得Mac OS X在这里做了什么(有人在评论中叽叽喳喳吗?),但重点是明确绑定到两个协议都不会有任何意外。

答案 1 :(得分:2)

无论哪种方式都很好。

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

某些平台不支持接受v6套接字上的v4连接,因此为了获得最大的兼容性,我采用“双插槽”方法。