Я создал многопоточную программу (pthread) C++, которая настроена на использование списка пользовательских DNS. В моих тестах я использовал 8.8.8.8 google для хорошего ex, и некоторый случайный ip, например 113.65.123.138, 13.23.123.87, чтобы проверить потерю. Но все идет одинаково в обоих случаях, успешно.Curl возвращает все нормально, когда плохой ip поставлен в CURLOPT_DNS_SERVERS
Curl был построен с C-аров поддержки, и я проверил только, чтобы быть уверенным:
curl_version_info_data *data = curl_version_info(CURLVERSION_NOW);
cout<<endl<<"Curl version: "<< data->version <<endl
<<"AsyncDNS: "<<(data->features | CURL_VERSION_ASYNCHDNS ? "YES" : "NO" ) <<endl;
//output: Curl version: 7.30.0 \n AsyncDNS: YES
Остальная часть кода:
curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, thisThreadData->current_dns->dns_str.c_str());
curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE,false); //thread safety
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, CONNECT_TIMEOUT);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, CONNECTION_TIMEOUT);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_to_string);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &getUrlOutput->header);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &getUrlOutput->html);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip,deflate");
status=curl_easy_perform(curl);
Я проверил случайные IP-адреса (на всякий случай я наткнулся на какой-то действующий DNS):
$ host google.com 113.65.123.138
;; connection timed out; no servers could be reached
$ host google.com 13.23.123.87
;; connection timed out; no servers could be reached
Что мне не хватает?
Update
Я пробовал последнюю версию Libcurl в (7.33.0) и с-АРЕС (1.10.0) и тот же результат.
Также, если я поставлю неправильный домен для URL-адреса, он возвращает CURLE_HTTP_RETURNED_ERROR (22)
против CURLE_COULDNT_RESOLVE_HOST (6)
.
Update 2
Забыл упомянуть, что я использовал HTML_PROXY для подключения, и кажется, что является важным аспектом, см ответа.