如何从boost::asio::ip::tcp::socket::local_endpoint().address()中提取地址字符串

如何从boost::asio::ip::tcp::socket::local_endpoint().address()中提取地址字符串,tcp,boost-asio,endpoint,Tcp,Boost Asio,Endpoint,我正在使用。在我的TCP客户端和TCP服务器之间建立连接后,我希望将本地\u端点的地址作为字符串,将远程\u端点的地址作为两侧的字符串 auto localAddress = tcpSocket.local_endpoint().address().to_string(); auto remoteAddress = tcpSocket-remote_endpoint().address().to_string(); 但是我很困惑。在某些情况下,我得到了127.0.0.1,在某些情况下,我得到了

我正在使用。在我的TCP客户端和TCP服务器之间建立连接后,我希望将
本地\u端点
的地址作为字符串,将
远程\u端点
的地址作为两侧的字符串

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
。Is
::ffff:127.0.0.1
V6和
127.0.0.1
Is V4?我只需要IP地址
127.0.0.1


我还可以进行子字符串提取以获得
127.0.0.1
片段。但我想知道是否有一种标准技术可以将
boost::asio
提取/转换为
::ffff:127.0.0.1
127.0.0.1

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

IPv6的地址比IPv4多得多,因此只能将IPv6地址的一部分映射到IPv4


当您拥有
IPv6
时,您可以使用
is\u v4\u mapped
方法检查此映射
ip6->ip4
。如果是这样,只需使用
operatorPerfect!工作起来很有魅力。谢谢你的解释。我现在明白多了。
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;
    }
}