【问题标题】:Accept IPv4 and IPv6 together in boost::asio在 boost::asio 中同时接受 IPv4 和 IPv6
【发布时间】:2015-09-16 11:31:16
【问题描述】:

简短的问题:我是boost::asio 的新手,我想知道是否可以创建一个tcp::acceptor 来同时监听 IPv4 和 IPv6 连接。 boost 主页上的教程显示如下:

_acceptor = new tcp::acceptor(_ioService, tcp::endpoint(tcp::v4(), 3456));

端点始终使用特定协议指定。同一个端口不能同时监听 IPv4 和 IPv6 吗?

【问题讨论】:

    标签: c++ boost-asio ip-address ipv6 ipv4


    【解决方案1】:

    如果您创建 IPv6 接受器,如果 IPV6_V6ONLY 套接字选项被清除,它将接受 IPv4 和 IPv6 连接。 IPv4 地址将以IPv4-mapped 格式显示为 IPv6 地址。

    问题主要围绕 IPV6_V6ONLY 是否可用或默认值是什么(打开或关闭)而出现。所以我发现最好将它明确设置为你想要的。

    此外,Windows XP 根本不支持该选项。

    所以如果你想跨系统兼容,建议创建两个socket,一个用于v4,一个用于v6,设置IPV6_V6ONLY。

    【讨论】:

    • 这正是我想要的。我确实需要一些跨系统的兼容性,最重要的是 Windows 7 或更高版本和 linux,而我已经看到从内核 2.6 开始就支持 IPV6_V6ONLY。 XP/Server2003 应该不是问题,但是在运行时以某种方式检查所有可用的套接字选项会很好 - 遗憾的是我没有想出一种方法来做到这一点,据我所知,这都是预处理器定义的(或者我尝试设置选项并检查绑定错误)。无论如何,这回答了我的问题。
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2021-07-30
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多