下面的转换工作正常,但是当我有 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 个字节来存储,对于主机部分,这在相同的 header 中用 struct in6_addr
覆盖。但是,此外,IPv6 地址还包含 scope 除了可能对链路本地地址至关重要的主机之外。因此,仅使用主机部分是不够的。
您应该阅读有关编程双栈或纯 IPv6 应用程序的通用手册。特别是,struct sockaddr_storage
作为两个地址的公共(public)存储,以及 getaddrinfo
函数解析名称(仅数字或 NETDB)。
关于c++ - 将 IP 地址从 sockaddr_in6 转换为 in_addr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818202/