当服务器不可访问时,curl_easy_performer返回-1

curl_easy_perform returns -1 when server is not reachable

本文关键字:easy performer 返回 curl 服务器 访问      更新时间:2023-10-16

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

这是我的示例代码。

我的应用程序代码是用c++编写的,我正在读取响应和响应头。

  lCode = curl_easy_setopt(curlHandle, CURLOPT_HEADERFUNCTION,
                                      HttpClientImplCurl::recvFunctionHeader);
    if (lCode != CURLE_OK) {
        LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_HEADERFUNCTION returned %dn", 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 %dn", 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 %dn", 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 %dn", 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 %dn", 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 %dn", 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 %dn", 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 recv2n");
    ((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 recv1n");
    ((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_performer返回的值为何为-1的详细信息。