【问题标题】:Curl returns all ok when bad ip supplied to CURLOPT_DNS_SERVERS当错误的 ip 提供给 CURLOPT_DNS_SERVERS 时,Curl 返回一切正常
【发布时间】:2013-11-25 13:22:45
【问题描述】:

我制作了一个多线程 (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),结果相同。

另外,如果我为 url 提供了错误的域,它会返回 CURLE_HTTP_RETURNED_ERROR (22) 而不是 CURLE_COULDNT_RESOLVE_HOST (6)

更新 2

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

【问题讨论】:

    标签: c++ c curl dns libcurl


    【解决方案1】:

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

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

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

    在我的情况下,当代理的 DNS 发现错误时,它会返回一个带有“找不到主机”消息的 html 格式的错误页面,html_status 503,这就是为什么 curl 通过了 dns 检查并说域正常,但失败并显示 @987654322 @。

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多