while(do_again) {
rc = gethostbyname_r(host, &hbuf, tmp, TMPLEN, &hp, &my_h_errno);
if (rc != 0) {
if(my_h_errno == TRY_AGAIN) {
printf("HOST NOT FOUND: got a TRY_AGAIN response from gethostbyname_r()n");
continue;
} else if (my_h_errno == HOST_NOT_FOUND) {
printf("HOST NOT FOUND: Got an authoritative answern");
exit(0);
} else {
printf("Other errors..n");
exit(0);
}
}
do_again = false;
}
对于Ubuntu 19.04和20.04上不可解析的主机名,上面的代码总是返回my_h_errno
设置为TRY_AGAIN
。在以前版本的操作系统或其他Linux版本上,它通常返回一个更权威的版本HOST_NOT_FOUND
。
呼叫(gethostbyname_r
(究竟是如何工作的?最新版本的Ubuntu上的dns或查找机制是否发生了任何变化,导致了这种行为?
[Update]安装libnss-myhostname(作为主机名解析的后备机制(解决了这个问题。
对glibc代码的调试使我达到了调用上述库函数(如果存在(的地步,其中对于不可解析的主机,h_erno设置为HOST_NOT_FOUND。对于这种情况,最初在glibc的gethostbyname_r功能中将其设置为TRY_AGAIN。
从手动
gethostbyname*((、gethostbyaddr*((,herror((和hstreror(功能已过时。应用程序应该使用getaddrinfo(3(,getnameinfo(3(和gai_strerror(3(。