gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:35 25 4
gpt4 key购买 nike

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

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 超时小很多。

谁能解释行为上的差异?

最佳答案

当对特定目标主机(任一协议(protocol))的路由查找产生无法访问/禁止/拒绝/等时,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

关于c++ - IPv4 和 IPv6 地址的 connect() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com