gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:36:53 27 4
gpt4 key购买 nike

我正在使用 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

最佳答案

ip::address存储 IPv4 或 IPv6 地址。你可以查看 is_v6() 存储了什么样的地址或 is_v4()方法。

IPv6的地址比IPv4多得多,所以只有部分IPv6地址的子集可以映射到IPv4。

当你有 IPv6你可以使用 is_v4_mapped查看此 map 的方法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

关于tcp - 如何从 boost::asio::ip::tcp::socket::local_endpoint().address() 中提取地址字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444630/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com