c++ - 当服务器无法访问时,curl_easy_perform 返回 -1

标签 c++ c curl libcurl

当我尝试对无法访问的服务器执行一些 HTTP_POST、HTTP_DELETE 操作时,返回代码有时为 -1。因为我的应用程序正在崩溃。

这是我的示例代码。

我的应用程序代码是用 C++ 编写的,我也在其中读取响应和响应 header 。

  lCode = curl_easy_setopt(curlHandle, CURLOPT_HEADERFUNCTION,
                                      HttpClientImplCurl::recvFunctionHeader);

    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_HEADERFUNCTION returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);
        return http_code;

    }


    lCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEHEADER,
                                      &readResHeaderBuffer);

    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_WRITEHEADER returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);
        return http_code;

    }

        lCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION,
                             HttpClientImplCurl::recvFunction);

    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt WRITEFUNCTION returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);
        return http_code;

    }

    lCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA,
                             &readResBuffer);

    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt WRITEDATA returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);
        return http_code;

    }

    lCode = curl_easy_setopt(curlHandle, CURLOPT_CUSTOMREQUEST, "DELETE"); /* !!! */

    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_CUSTOMREQUEST returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);
        return http_code;

    }

    lCode =  curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDS, aInRemovedata.getBuffer()); /* data goes here */

    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_POSTFIELDS  returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);
        return http_code;

    }

lCode = curl_easy_perform(curlHandle);


    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_perform returned %d\n", lCode);
        curl_slist_free_all(lHeaders);
        errorBuff = curl_easy_strerror(lCode);---->my doubt is when i am geting "-1", this line is caused the crash.
        return http_code;
    }

我的回调如下,

  size_t
HttpClientImplCurl::recvFunctionHeader(void *aInBuf, size_t aInSize,
                                size_t aInNmemb, void* aInUserp)
{
    fprintf(stderr, "curl error: too small buffer in recv2\n");
    ((std::string*)aInUserp)->append((char*)aInBuf, aInSize * aInNmemb);
    return aInSize * aInNmemb;
}


// Private static callback
size_t
HttpClientImplCurl::recvFunction(void *aInBuf, size_t aInSize,
                                size_t aInNmemb, void* aInUserp)
{
    fprintf(stderr, "curl error: too small buffer in recv1\n");
    ((std::string*)aInUserp)->append((char*)aInBuf, aInSize * aInNmemb);
    return aInSize * aInNmemb;
}

请帮我解决这个问题,为什么我们偶尔会得到“-1”而不是“28”。

这是函数签名,其中 errorBuf 作为参数

 int
HttpClientImplCurl::put(const HttpClient& aInClient,const base::Buffer& aInPutdata,
                          base::Buffer& aOutRecvBuf,base::Buffer&  aOutRecvHeaderBuf,const char*& errorBuff)

最佳答案

您可以尝试设置 CURLOPT_ERRORBUFFER 和 CURLOPT_VERBOSE 来获取有关为什么 curl_easy_perform 返回的值为 -1 的更多信息。

关于c++ - 当服务器无法访问时,curl_easy_perform 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20147975/

相关文章:

c++ - 避免在 Visual C++ 2008 中跳出 block

c++ - 在第二个节点解析嵌套的 yml 文件

c++ - 在我的程序中更改共享库中定义的变量不会从共享库中反射(reflect)出来

php - 如何通过 Curl 登录到使用 javacookies 的 https?

windows - 等效于 cURL 命令上传文件的 PowerShell

php - PHP 网页抓取

c++ - 将位图设置为 IMediaSample

c++ - 如何在 C++ 中对某些数据结构进行父类(super class)化?

c - C 中的 OOP,隐式将自身作为参数传递

c - 按 n 字节屏蔽