下面的转换工作正常,但是当我有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
的代码在哪里?
答案 0 :(得分:2)
抱歉,没办法。 IPv6地址无法转换为struct in_addr
,除非在IPv4映射地址时发生极端情况。
IPv6主机地址需要存储16个字节,并且在主机部分的相同标头中包含struct in6_addr
。但是,除了主机之外,IPv6地址还包含范围,这对于例如链路本地地址可能是关键的。因此,仅仅使用主机部分是不够的。
您应该阅读有关双栈或仅IPv6应用程序编程的一般手册。特别是,struct sockaddr_storage
作为两个地址的公共存储,getaddrinfo
函数解析名称(仅限数字或NETDB)。