将IP地址从sockaddr_in6转换为in_addr

时间:2015-01-07 11:14:53

标签: c++ sockets visual-c++

下面的转换工作正常,但是当我有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的代码在哪里?

1 个答案:

答案 0 :(得分:2)

抱歉,没办法。 IPv6地址无法转换为struct in_addr,除非在IPv4映射地址时发生极端情况。

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

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