如何从 boost::asio::ip::tcp::socket::local_endpoint().address() 中提取地址字符串
How to extract address string from boost::asio::ip::tcp::socket::local_endpoint().address()
我正在使用 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
标准技术 extract/convert ::ffff:127.0.0.1
到 127.0.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;
}
}
我正在使用 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
标准技术 extract/convert ::ffff:127.0.0.1
到 127.0.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;
}
}