c++ - 将 IP 地址从 sockaddr_in6 转换为 in_addr

标签 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 的代码在哪里?

最佳答案

对不起,没办法。 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/

相关文章:

c++ - cmake 如何在 Visual Studio 中激活 "Inherit from parent"链接选项

c++ - 为什么零初始化不是 c++ 中非初始化变量的默认值?是否有强制执行它的编译器选项?

c++ - QSet::find() 迭代器解引用出现 “cannot convert ‘this’ 指针”错误?

c# - TCP程序包大于MTU时,C#Socket.Receive()发生故障

C++套接字设计

c - 在接受套接字之前创建的子进程中使用父进程接受的套接字

c++ - Visual C++ constexpr提示

c++ - 如何将 ASM obj 文件与 C++ 程序集成?

java - 测试使用 visual studio 编写的 C++ android 应用程序的最佳方法是什么。无需升级到 windows 专业版

c++ - 基于 Raspberry pi 的终端 - 使用 GUI 应用程序快速启动 - 总体思路和操作方法