C inet_ntop返回的IPv6地址特别不正确
我知道这一点,但答案毫无意义,可能是针对另一个问题 在我的iOS应用程序中,我使用CFSockets连接到服务器,并希望显示服务器的远程地址。当使用IPv4时,它的工作原理与预期一致,但在IPv6中会出现奇怪的结果,即地址的网络前缀是正确的,但主机位完全不同C inet_ntop返回的IPv6地址特别不正确,c,posix,C,Posix,我知道这一点,但答案毫无意义,可能是针对另一个问题 在我的iOS应用程序中,我使用CFSockets连接到服务器,并希望显示服务器的远程地址。当使用IPv4时,它的工作原理与预期一致,但在IPv6中会出现奇怪的结果,即地址的网络前缀是正确的,但主机位完全不同 int sock\u fd=//假设我已经有了fd 结构sockaddr addr; socklen\u t addr\u len=sizeof(addr); getpeername(sock\u fd,&addr,&addr\u len)
int sock\u fd=//假设我已经有了fd
结构sockaddr addr;
socklen\u t addr\u len=sizeof(addr);
getpeername(sock\u fd,&addr,&addr\u len);
字符地址字符串[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6,&((struct sockaddr_in6*)和addr)->sin6_addr,addressString,INET6_ADDRSTRLEN);
我所期望的是2607:f2f8:a4c8::2
,但我得到的是一个具有正确网络前缀但每次都有不同主机位的地址,例如:
vvvvvvvvvvvvvvvvvvvv Random?
2607:f2f8:a4c8:0:c400:13b0:f6c5:afa
^^^^^^^^^^^^^^ Correct
getpeername(2)
的手册页给出了发生这种情况的原因的提示:
应初始化address_len参数,以指示address指向的空间量。返回时,它包含返回地址的实际大小(字节)
如果提供的缓冲区太小,地址将被截断
struct sockaddr
的大小对于IPv6地址来说太小,将导致地址被截断
您需要将struct sockaddr\u存储
与getpeername
一起使用,而不仅仅是struct sockaddr
struct sockaddr\u存储地址;
socklen\u t addr\u len=sizeof(addr);
getpeername(套接字,(结构sockaddr*)和addr,以及addr\u len)
您知道设备在同一网络上有多个IP地址是很常见的吗?你知道什么是IPv6隐私地址吗?@JosephSible,我正在连接到internet上的一个网站。使用curl,我可以看到正确的IP地址连接到v6.burn.net(2607:f2f8:a4c8::2)端口80(#0)
,它不能解决我的任何一点。你能用打印或调试器转储addr
的内容吗?里面有什么,它与文本输出匹配吗?还要在调用getpeername
和inet\u ntop
时添加错误检查。这样的事情有时会令人惊讶。