如何从boost :: asio :: ip :: tcp :: socket :: local_endpoint()。address()

时间:2019-12-22 13:33:14

标签: tcp boost-asio endpoint

我正在使用boost::asio::ip::tcp。一旦在我的TCP客户端和TCP服务器之间建立了连接,我想在两边都将local_endpoint的地址作为字符串,并将remote_endpoint的地址作为字符串。

auto localAddress = tcpSocket.local_endpoint().address().to_string();
auto remoteAddress = tcpSocket-remote_endpoint().address().to_string();

但是我很困惑。在某些情况下,我得到127.0.0.1,在某些情况下,我得到::ffff:127.0.0.1::ffff:127.0.0.1是V6,127.0.0.1是V4吗?我只需要127.0.0.1的IP地址。

我也可以提取子串来获得127.0.0.1片段。但是我想知道是否有一种boost::asio标准技术可以将::ffff:127.0.0.1提取/转换为127.0.0.1吗?

1 个答案:

答案 0 :(得分:1)

ip::address存储IPv4或IPv6地址。您可以检查is_v6()is_v4()方法存储的地址类型。

IPv6的地址远不止IPv4,因此只能将IPv6地址的某些子集映射到IPv4。

拥有IPv6后,您可以使用is_v4_mapped方法来检查此地图ip6 -> ip4是可能的。如果是这样,只需使用operator<<重载以字符串格式提取IPv4:

示例代码:

boost::asio::ip::address addr{boost::asio::ip::make_address("::ffff:127.0.0.1")};
if (addr.is_v6())
{
    boost::asio::ip::address_v6 ipv6 = addr.to_v6();

    if (ipv6.is_v4_mapped())
    {
        auto ipv4 = ipv6.to_v4();
        std::ostringstream os;
        os << ipv4;

        std::string str = os.str(); // 127.0.0.1
        std::cout << str << std::endl;
    }
}

Live demo