为什么libcurl有时会抱怨';不能';无法解析主机名';?
我用libcurl编写了一个多线程程序,但有时curl会抱怨它在execcurl执行后无法解析主机名,有时不能为什么libcurl有时会抱怨';不能';无法解析主机名';?,curl,libcurl,Curl,Libcurl,我用libcurl编写了一个多线程程序,但有时curl会抱怨它在execcurl执行后无法解析主机名,有时不能 size_t Http::WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; MemoryStruct *mem = (MemoryStruct *)userp; mem->memory
size_t Http::WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
MemoryStruct *mem = (MemoryStruct *)userp;
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
assert(NULL != mem->memory);
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
void Http::run(const URL &url, Http::FinishedCallback cbk)
{
CURL *handle = curl_easy_init();
if (handle)
{
MemoryStruct *chunk = new MemoryStruct;
chunk->memory = (char *)malloc(1); /* will be grown as needed by the realloc above */
chunk->size = 0; /* no data at this point */
CURLcode res;
curl_easy_setopt(handle, CURLOPT_URL, url.getUrl().c_str());
curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void *)chunk);
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
curl_easy_setopt(handle, CURLOPT_TIMEOUT, 10L);
curl_easy_setopt(handle, CURLOPT_CONNECTTIMEOUT, 10L);
res = curl_easy_perform(handle);
/* check for errors */
if (CURLE_OK != res)
{
chunk->status = false;
std::string errCode = std::to_string(res);
chunk->memory = (char *)realloc(chunk->memory, chunk->size + errCode.size() + 1);
memcpy(&(chunk->memory[chunk->size]), errCode.c_str(), errCode.size());
chunk->size += errCode.size();
chunk->memory[chunk->size] = 0;
}
else
{
chunk->status = true;
}
#ifdef _DEBUG
chunk->url = url;
#endif
cbk(chunk);
free(chunk);
curl_easy_cleanup(handle);
}
}
void Http::get(URL url, FinishedCallback cbk)
{
std::thread http(&Http::run, Http(), url, cbk);
http.detach();
}
Http::~Http()
{
curl_global_cleanup();
}
我是发票员
int index = 0;
bool finish = false;
void func(Http::MemoryStruct *memo)
{
if (!memo->status)
{
#ifdef _DEBUG
LOG(INFO) << "Failure:\t" << curl_easy_strerror((CURLcode)atoi(memo->memory)) << "\n";
#endif
}
else
{
//LOG(INFO) << memo->memory << '\n';
}
finish = memo->status;
++index;
}
int main(void)
{
curl_global_init(CURL_GLOBAL_ALL);
URL::AttribMap attribMap{ { "class", "System" }, { "token", "KY0SQ3FX996PU1ZO" }, { "type", "GetConfig" } };
URL url("open.55.la", "/index.php", attribMap);
Http http;
while(index++ <=10)
{
try
{
http.get(url, func);
}
catch (std::_System_error &err)
{
LOG(INFO) << err.what();
}
}
while (true)
{
;
}
el::Loggers::flushAll();
return EXIT_SUCCESS;
}
int索引=0;
bool finish=false;
void func(Http::memorystuct*memo)
{
如果(!备忘录->状态)
{
#ifdef_调试
LOG(INFO)这是libcurl为CURLE\u couldn\u RESOLVE\u主机返回的错误消息
错误代码(6)
我将引用
无法解析主机。给定的远程主机地址不正确
已解析。无法解析给定服务器的地址。
要么给定的主机名是错误的,要么DNS服务器是错误的
行为不端,不知道这个名字什么时候应该或者可能
即使是运行curl的系统也配置错误,因此无法运行
查找/使用正确的DNS服务器
如果对有时有效有时无效的主机名间歇返回此消息,则表明您的系统不知何故已损坏,DNS服务器未正确响应,或者可能是某种DOS防护错误调整。感谢您的详细回答,DNS服务器未正确响应,或者可能是某种DOS防护错误调整。感谢您的详细回答evention调错了。可能是一个合适的原因,最近我将尝试找出它是否如您所描述的那样引起。我还怀疑它是否是由线程争用条件引起的。