2013-11-25 1 views
0

Я создал многопоточную программу (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 для подключения, и кажется, что является важным аспектом, см ответа.

ответ

0

В соответствии с curl forums это ожидаемое поведение, поскольку dns обрабатывается прокси-сервером.

Когда я использую прокси-сервер, как я (или я могу) контроль ли целевой URL разрешен локально или прокси-сервером? У меня есть условия, в которых мне нужны оба варианта.

с HTTP-прокси клиент (скручивание) руки над полным URL к прокси-сервера и прокси-сервер будет разрешить имя хоста.
Если вы действительно хотите сделать это на стороне клиента, то вам необходимо первым разрешить имя, а затем «повторно организовать» URL-адрес, чтобы использовать IP только numericals и установить Хост: заголовок содержит имя хоста вы решены.

В моем случае, когда DNS Прокси-сервер находит ошибку он возвращает HTML отформатированный страницу ошибки с сообщением «Сервер не найден», html_status 503, поэтому завиток прошли DNS проверки и сказал домен в порядке, но не с CURLE_HTTP_RETURNED_ERROR.