您应该始终显式绑定两个套接字,其中 IPv6 套接字与IPV6_V6ONLY.
为什么?跨平台兼容性。
默认情况下,Windows 要求您显式绑定 IPv4 和 IPv6。仅绑定到 IPv6 也不会隐式绑定到 IPv4。
默认情况下,当您绑定到 IPv6 时,Linux 也会隐式绑定到 IPv4,前提是net.ipv6.bindv6onlysysctl 设置为0。Debian 等发行版将此默认值更改为1,打破了您的假设。
我不记得 Mac OS X 在这里做了什么(请有人在评论中叽叽喳喳?),但重点是显式绑定到这两个协议不会留下任何惊喜。