Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C inet_ntop返回的IPv6地址特别不正确_C_Posix - Fatal编程技术网

C inet_ntop返回的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)

我知道这一点,但答案毫无意义,可能是针对另一个问题

在我的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);
字符地址字符串[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
时添加错误检查。这样的事情有时会令人惊讶。