IPv6 和 IPv4 的套接字侦听器
Socket listener for IPv6 and IPv4
我使用流行的教程移植了一个应用程序以支持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 连接,因此为了获得最大的兼容性,我会采用"两个套接字"方法。
相关文章:
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- Windows 2012 R2 closesocket()挂在侦听套接字上
- C++ 套接字侦听器 accept() 在发布时不接受连接请求
- IPv6 和 IPv4 的套接字侦听器
- 轮询TCP套接字空闲侦听
- 非本地 IP 的套接字侦听器不起作用
- 在 C/Unix 中的 IP 子网上侦听的套接字
- IP_ADD_MEMBERSHIP套接字上,套接字是否也会侦听单播
- 即使在文件描述符不可用的情况下,也能有效地侦听多个套接字
- 无法使用UDP套接字c++进行侦听
- 我可以对多个侦听套接字使用相同的boost::asio::io_service吗
- c侦听器与winsock-sender dll之间的套接字通信
- 如何在不相互阻塞的情况下使用套接字和计时器
- Boost套接字/接收器无法在同一端口上侦听/连接
- 在fork()之后关闭侦听套接字
- 我如何设置一个不断侦听循环与接收udp套接字,而不使它成为一个服务器
- 提升 Asio UDP 服务器设置套接字以侦听指定的 IP
- 如何在winsock2c++中停止/重新启动侦听和接受服务器套接字?
- 创建多个侦听套接字