2013-11-25 42 views
0

我製作了一個配置爲使用自定義dns列表的多線程(pthread)C++程序。 在我的測試中,我已經使用谷歌的8.8.8.8爲好前,和一些隨機ip像113.65.123.138,13.23.123.87測試失敗。但是兩種情況都成功了。當壞IP提供給CURLOPT_DNS_SERVERS時,Curl返回所有ok。

捲曲與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 

我在想什麼?

更新

我已經試過libcurl中的最新版本(7.33.0)和c-頃(1.10.0)和相同的結果。

此外,如果我提供一個URL的域名錯誤,它返回CURLE_HTTP_RETURNED_ERROR (22)反對CURLE_COULDNT_RESOLVE_HOST (6)

更新2

忘了提,我使用的HTML_PROXY進行連接,而且似乎這是一個重要的方面,看答案。

回答

0

根據curl forums,由於代理處理dns,所以它的預期行爲。

當我使用的是代理,我如何(或可我)控制 是否達到了目標URL是本地或由代理解決?我有 條件,我需要兩種選擇。

隨着HTTP代理客戶端(捲曲)移交完整的URL到代理和代理將解析主機名
如果你確實是想做它的客戶端,那麼你首先需要解析名稱然後「重新排列」這個URL才能使用IP 數字,並且設置Host:header來包含主機名你已經解決了 。

在我的情況下,當代理服務器的DNS查找返回與消息的HTML格式化錯誤頁面錯誤「找不到主機」,html_status 503,這就是爲什麼捲曲通過DNS檢查,並表示,域名是確定的,但是失敗與CURLE_HTTP_RETURNED_ERROR