Linux c++:getaddrinfo 因 EAI_AGAIN 而失败,curl 无法解析主机

Linux c++: getaddrinfo failed with EAI_AGAIN, curl could not resolve host

本文关键字:curl 主机 失败 getaddrinfo c++ EAI AGAIN Linux      更新时间:2023-10-16

我通过ppp打开GSM连接,并尝试使用curl从URL下载文件。

使用很少的设备,我从curl中得到CURLE_COULDNT_RESOLVE_HOST错误,getaddrinfo导致EAI_AGAIN

route我的 ppp0 接口注册正确。resolv.conf包含谷歌DNS,在终端中手动执行nslookup正在工作。

我不知道为什么它不起作用。我唯一知道的是:IPv6是不可能的。

这是我的getaddrinfo代码

int checkINet(std::string address)
{
   struct addrinfo hints, *servinfo, *p;
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = AF_INET;
   hints.ai_socktype = SOCK_STREAM;
   char ip_addr[INET6_ADDRSTRLEN];
   int s = getaddrinfo(address.c_str(), NULL, &hints, &servinfo);
   if (s != 0)
   {
      std::cout << "No connection possible: " << address << "n";
      std::cout << "getaddrinfo: " << s << " " << gai_strerror(s) << "n";
      return -1;
   }
   else
   {
      std::cout << "Conection successful: " << address << "n";
      for (p = servinfo; p != NULL; p = p->ai_next)
      {
         void *addr;
         if (p->ai_family == AF_INET)
         {
            struct sockaddr_in *ipv4 =(struct sockaddr_in *)p->ai_addr;
            addr = &(ipv4->sin_addr);
         }
         else
         {
            struct sockaddr_in6 *ipv6 =(struct sockaddr_in6 *)p->ai_addr;
            addr = &(ipv6->sin6_addr);
         }
         inet_ntop(p->ai_family, addr, ip_addr, sizeof ip_addr);
         std::cout << addr << "n";
      }
   }
   freeaddrinfo(servinfo);
   return 0;
}

对于卷曲:

   CURL *curl;
   FILE *fp;
   CURLcode res;
   // initialise a connection to the server
   curl = curl_easy_init();
   if (curl)
   {
      fp = fopen(UPDATE_ZIP, "wb");
      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
      curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
      curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
      res = curl_easy_perform(curl);
      curl_easy_cleanup(curl);
      fclose(fp);
      if (CURLE_OK != res)
      {
          std::out << "curl failed with: " << res << "n";
          return res;
      }
      return 0;
   }
   return -1;
短暂的

tipp是对的。更改了/etc/nsswitch.con内的顺序主机:文件 DNS主机:DNS 文件