IPv6和IPv4的套接字侦听器

due*_*l0r 5 c++ sockets ipv4 ipv6

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

这真的是要走的路吗?有人说不IPV6_V6ONLY应该使用(显然它已经过时了,因为通过线路进行IPv4映射),有人说使用一个套接字用于两种协议都没问题.

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

Jer*_*ser 4

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

为什么?跨平台兼容性。

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

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

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