当错误的IP提供给CURLOPT_DNS_SERVERS时,Curl返回所有ok

时间:2013-11-25 13:22:45

标签: c++ c curl dns libcurl

我制作了一个多线程(pthread)c ++程序,配置为使用自定义dns列表。 在我的测试中,我使用google的8.8.8.8作为好的ex,并且一些随机ip如113.65.123.138,13.23.123.87来测试失败。但两种情况都成功了。

Curl是在C-ares的支持下构建的,我测试的确是:

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

我错过了什么?

更新

我尝试过libcurl的最新版本(7.33.0)和c-ares(1.10.0)以及相同的结果。

此外,如果我为网址提供了错误的域名,则会返回CURLE_HTTP_RETURNED_ERROR (22),而不是CURLE_COULDNT_RESOLVE_HOST (6)

更新2

忘记提到我使用HTML_PROXY进行连接,这似乎是一个重要的方面,请参阅答案。

1 个答案:

答案 0 :(得分:0)

根据curl forums,它是预期的行为,因为dns由代理处理。

  
    

当我使用代理时,我如何(或我可以)控制     目标网址是在本地解析还是由代理解析?我有     我需要两种选择的条件。

  
     

使用HTTP-Proxy客户端(curl)将完整的URL移交给代理,代理将解析主机名
  如果真的想要在客户端进行,那么您需要   首先解析名称,然后“重新安排”URL以使用IP   仅限数字并设置Host:标头以包含您的主机名   解决。

在我的情况下,当代理的DNS发现错误时,它返回一个html格式化的错误页面,其中包含“找不到主机”消息,html_status 503,这就是为什么curl通过dns检查并说域名没问题但是{{{ 1}}。