लिनक्स c ++: getaddrinfo EAI_AGAIN साथ विफल रहा है, कर्ल मेजबान हल नहीं कर सका

वोट
1

मैं PPP पर एक जीएसएम कनेक्शन खोलने और कर्ल URL से एक फाइल डाउनलोड करने के लिए प्रयास करें।

कुछ उपकरणों के साथ मैं एक मिल CURLE_COULDNT_RESOLVE_HOST से त्रुटि curlऔर getaddrinfoमें परिणाम EAI_AGAIN

में routeमेरी ppp0 इंटरफेस सही पंजीकृत है। resolv.conf गूगल डीएनएस होता है और मैन्युअल रूप से क्रियान्वित करने nslookupटर्मिनल में काम कर रहा है।

मुझे पता नहीं क्यों यह काम नहीं कर रहा हो गया। केवल एक चीज मैं जानता हूँ कि: आईपीवी 6 संभव नहीं है।

इस के लिए मेरे कोड है 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;
02/11/2017 को 12:33
उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
0

ephemient tipp सही है। अंदर बदल दिया आदेश /etc/nsswitch.conसे मेजबान: फ़ाइलों DNS को होस्ट करता है: dns फ़ाइलें

06/11/2017 को 09:27
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more