Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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 getaddrinfo在不同操作系统上的作用不同_C_Linux_Networking_Getaddrinfo - Fatal编程技术网

C getaddrinfo在不同操作系统上的作用不同

C getaddrinfo在不同操作系统上的作用不同,c,linux,networking,getaddrinfo,C,Linux,Networking,Getaddrinfo,我正在测试一个错误路径,该路径要求我从getaddrinfo删除一个请求。我设置了两个虚拟机: RHEL 7.9 Ubuntu 20 这两台机器上的代码是相同的,只需调用getaddrinfo for test.com即可。我阻止了所有传入的数据包,以模拟getaddrinfo请求被丢弃,但是在完全相同的场景中,这两个操作系统的性能不同 RHEL在12秒后超时,并出现错误EAI_NONAME(无此类文件或目录) Ubunutu在20秒后超时,再次出现错误EAI_(资源暂时不可用) 所以我

我正在测试一个错误路径,该路径要求我从getaddrinfo删除一个请求。我设置了两个虚拟机:

  • RHEL 7.9
  • Ubuntu 20
这两台机器上的代码是相同的,只需调用getaddrinfo for test.com即可。我阻止了所有传入的数据包,以模拟getaddrinfo请求被丢弃,但是在完全相同的场景中,这两个操作系统的性能不同

  • RHEL在12秒后超时,并出现错误EAI_NONAME(无此类文件或目录)
  • Ubunutu在20秒后超时,再次出现错误EAI_(资源暂时不可用)
所以我的两个问题是:

  • 为什么这些给出了两个不同的错误
  • 为什么超时不同?它们的定义在哪里?我试图查看linux的源代码,但没有弄明白这一点
代码:

RHEL resolv.conf:

search ht.home
nameserver 192.168.0.1
nameserver [IPV6 address 1]
nameserver [IPV6 address 2]
Ubuntu:

nameserver 127.0.0.53
options edns0 trust-ad
search ht.home

Ubuntu在这里的行为是正确的,RHEL的行为是错误的-结果是不确定的,因为它既无法获得名称的地址,也无法获得证明名称不存在的响应

这种机制可能是glibc bug(更确切地说,是故意的不一致行为)和RHEL配置与您阻止的远程名称服务器之间的差异,以及通过
systemd解析的Ubuntu配置之间的差异(您可能没有阻止它,而只是阻止它向真实网络发出查询?)。您可以在
strace
下运行测试程序,并在环回和真实网络接口上观看
tcpdump
来确认差异


基本上,在某些情况下,glibc将错误视为名称不存在,而在其他情况下,它将错误视为可报告的故障。如果您能够查询本地
systemd resolved
,它将返回
ServFail
错误代码,因为它无法从upstream名称服务器和glibc可能会报告这一情况,但不会报告自己未能联系名称服务器。

发布代码和编译参数。@AndrewHenle发布。最初没有包括它,因为两者都是相同的程序,并且编译方式相同,所以不认为它相关。
resolv.conf
看起来相同吗n两种环境?@larsks不,它们是不同的。我将在描述中发布。我认为这是因为您正在与不同的解析器对话:在您的Ubuntu系统上,您正在与本地
systemd resolved
实例对话,而在RHEL系统上,您正在与192.168.0.1上运行的任何东西对话。这与两个解析器非常相似eSolver的响应不同。如果您修改ubuntu resolv.conf使其看起来像RHEL,代码的行为会改变吗?
search ht.home
nameserver 192.168.0.1
nameserver [IPV6 address 1]
nameserver [IPV6 address 2]
nameserver 127.0.0.53
options edns0 trust-ad
search ht.home