IPv4和IPv6地址的connect()行为
Behaviour of connect() for IPv4 and IPv6 addresses
我创建了一个带有以下参数的套接字:
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:fc4: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
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- arr[-1]在c++中的奇怪行为
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- G锁定铸造到基础上会释放模拟行为
- 在C++中对T*类型执行std::move的意外行为
- std::当在256字节边界上写入整数时,流的奇怪行为
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 奇怪的构造函数行为
- 重载运算符new[]的行为取决于析构函数
- 不同语言中相同代码的不同行为
- 处理除以零会导致<csignal>意外行为
- 试图理解类对象的行为
- c++11评估顺序(未定义的行为)
- 从结构寻址时,MMAP变量的行为很奇怪
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 读取文件时运行时的未知行为
- strncpy之后的char数组的错误行为
- IPv4和IPv6地址的connect()行为