Linux gethostbyname_r()调用不可解析的主机,总是返回设置了h_errnop的主机以重试(在Ubuntu 19.04和20.04上)

Linux gethostbyname_r()调用不可解析的主机,总是返回设置了h_errnop的主机以重试(在Ubuntu 19.04和20.04上),linux,ubuntu,networking,hostname,gethostbyname,Linux,Ubuntu,Networking,Hostname,Gethostbyname,对于Ubuntu 19.04和20.04上的不可解析主机名,上述代码总是返回,并将my_h_errno设置为TRY_。在操作系统的早期版本或其他Linux版本上,它通常返回一个更权威的版本,HOST\u NOT\u FOUND 调用(gethostbyname\r)究竟是如何工作的?在最新版本的Ubuntu上,dns或查找机制是否有任何改变导致了这种行为?来自手册 gethostbyname*()、gethostbyaddr*()、herror()和hstrerror() 功能已经过时。应用程序

对于Ubuntu 19.04和20.04上的不可解析主机名,上述代码总是返回,并将
my_h_errno
设置为
TRY_
。在操作系统的早期版本或其他Linux版本上,它通常返回一个更权威的版本,
HOST\u NOT\u FOUND

调用(
gethostbyname\r
)究竟是如何工作的?在最新版本的Ubuntu上,dns或查找机制是否有任何改变导致了这种行为?

来自手册

gethostbyname*()、gethostbyaddr*()、herror()和hstrerror() 功能已经过时。应用程序应使用getaddrinfo(3), getnameinfo(3)和gai_strerror(3)

[更新] 安装libnss myhostname作为主机名解析的回退机制,修复了该问题


对glibc代码的调试使我达到了这样一个地步:如果存在,则调用上述库函数,对于不可解析的主机,将h_errno设置为HOST_NOT_FOUND。最初设置为在glibc的gethostbyname功能中再次尝试这种情况。

谢谢@kjohri。但是getaddrinfo(3)也导致了同样的问题,因为我猜该函数的实现功能与gethostbyname()的功能几乎相同,只是它们添加了对ipv6地址的支持。谢谢,它可以工作。我现在面临这个问题有一段时间了。
    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 answer\n");
             exit(0);
          } else {
             printf("Other errors..\n");
             exit(0);
          }
       }
       do_again = false;
    }