首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么libcurl有时会抱怨“无法解析主机名”?

为什么libcurl有时会抱怨“无法解析主机名”?
EN

Stack Overflow用户
提问于 2017-04-17 11:48:42
回答 1查看 3.7K关注 0票数 4

我编写了一个使用libcurl的多线程程序,但有时curl会抱怨它无法在exec curl_easy_perform之后解析主机名,有时不会。

代码语言:javascript
运行
复制
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();
}

这是召唤者。

代码语言:javascript
运行
复制
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;
}

它可能是由数据崩溃引起的吗?

EN

回答 1

Stack Overflow用户

发布于 2017-04-18 08:27:53

这是CURLE_COULDNT_RESOLVE_HOST错误代码(6)的错误消息libcurl返回的。

我会引用从卷发簿中退出状态部分的话

无法解析主机。未解析给定远程主机的地址。无法解析给定服务器的地址。或者给定的主机名是错误的,或者DNS服务器行为不当,并且不知道何时应该使用这个名称,或者甚至您运行的系统配置也不正确,这样它就无法找到/使用正确的DNS服务器。

如果有时或有时不工作的主机名称间歇返回,则表示系统故障,DNS服务器没有正确响应,或者是某种DOS预防错误地调好了。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43450899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档