我製作了一個配置爲使用自定義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進行連接,而且似乎這是一個重要的方面,看答案。