1
我创建具有以下PARAMS插座:行为connect()的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超时少。
任何人都可以解释行为的差异?
你有使用例如检查wireshark电线上发生了什么?可能是因为ipv4 syns被丢弃,而ipv6则返回一些icmp错误。 – PlasmaHH 2012-01-27 14:39:06
该行为很可能是操作系统特定的。它也可能取决于您和目标网络之间的网络拓扑。 – 2012-01-27 15:01:08
通常,如果主机无法找到路由,则远程连接可能会立即失败,但如果中间路由器无法路由或防火墙会阻止该连接,则会立即失败,但仍然是异步连接,则立即连接到本地主机应立即成功(或失败)重置,如果目标主机可访问但无响应或者防火墙以静默方式丢弃SYN,则只会超时。 – Useless 2012-01-27 15:39:54