将 IP 地址从sockaddr_in6转换为in_addr

Convert IP address from sockaddr_in6 to in_addr

本文关键字:转换 in addr in6 地址 sockaddr IP      更新时间:2023-10-16

下面的转换工作正常,但是当我有IPV6时如何处理?

sockaddr foo;
in_addr_t ip_address = ((sockaddr_in)foo).sin_addr.s_addr;

下面的代码失败:

sockaddr foo;
in_addr_t ip_address = ((sockaddr_in6)foo).sin6_addr.s_addr;
Error   1   error C2679: binary '=' : no operator found which takes a right-hand operand of type 'IN6_ADDR' (or there is no acceptable conversion)  

sockaddr_in转换为in_addr的代码在哪里?

对不起,没办法。IPv6地址不能转换为struct in_addr,除非在IPv4映射地址时发生极端情况。

IPv6 主机地址需要 16 个字节来存储,并且对于主机部分,在相同的标头中用struct in6_addr覆盖。但是,此外,IPv6地址除了主机之外还包含范围,这对于例如链路本地地址可能至关重要。因此,仅使用主机部分是不够的。

您应该阅读编程双栈或仅IPv6应用程序的一般手册。特别是,struct sockaddr_storage作为两个地址的公共存储,以及getaddrinfo解析名称(仅数字或 NETDB)

的功能。