Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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++ IPv4和IPv6地址的connect()行为_C++_C - Fatal编程技术网

C++ IPv4和IPv6地址的connect()行为

C++ IPv4和IPv6地址的connect()行为,c++,c,C++,C,我使用以下参数创建套接字: hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; getaddrinfo(serverName, port, &hints, &res); sFd = socket (res_node->ai_family, SOCK_STREAM, 0); 然后,我对可能存在或不存在的IPv4和Ipv6服务器地址进行连接调用。当服务器不可访问时,它在IPv4和IPv6地址的情况下具有不

我使用以下参数创建套接字:

hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(serverName, port, &hints, &res);
sFd = socket (res_node->ai_family, SOCK_STREAM, 0);
然后,我对可能存在或不存在的IPv4和Ipv6服务器地址进行连接调用。当服务器不可访问时,它在IPv4和IPv6地址的情况下具有不同的行为

在v4的情况下,在返回错误之前,它会被卡住很长一段时间(一些内部默认超时)。但是,在IPv6的情况下,行为会发生变化。对于某些地址,调用会立即返回错误,例如1111::22之类的地址,而对于某些地址,调用所需时间更长,例如fec0:60:69bc:94:211:25ff:fec4:6,但仍比IPv4超时时间短得多


有人能解释行为上的差异吗?

当到特定目标主机(任一协议)的路由查找产生无法访问/禁止/拒绝等结果时,connect()可能会立即失败。否则它必须发送探测(ARP/NDISC,以及可能的L4数据包,如TCP SYN/SCTP INIT)

没有到全局IPv6单播路由的系统的路由查找示例:

$ ip r g 2a01::1
unreachable 2a01::1 from :: dev lo  table unspec  proto kernel  src fe80::224:beff:fec2:7f16  metric -1  error -101 hoplimit 255
请注意与IPv6连接的主机的区别:

$ ip r g 2a01::1
2a01::1 from :: via fe80::2d0:3ff:fe93:d123 dev eth0  src 2001:527:500:770f:19e:84ff:fe9e:878  metric 0 

您是否与wireshark等公司核实过线路上发生了什么情况?对于ipv4,可能会删除SYN,而对于ipv6,您会返回一些icmp错误。这种行为可能是特定于操作系统的。它还可能取决于您与目标网络之间的网络拓扑。通常,与本地主机的连接应立即成功(或失败),如果您的主机找不到路由,远程连接可能立即失败,如果中间路由器无法路由或防火墙通过重置阻止连接,则快速但仍异步失败;如果目标主机可访问但无响应,或防火墙以静默方式删除SYN,则仅超时。