Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libcurl:http响应状态代码始终为空?_C_Http_Curl_Libcurl - Fatal编程技术网

libcurl:http响应状态代码始终为空?

libcurl:http响应状态代码始终为空?,c,http,curl,libcurl,C,Http,Curl,Libcurl,我使用的是libcurl 7.29.0 当服务器运行时,我的所有测试用例都正常工作,但是当服务器无法访问时,我收到一个CURLE\u HTTP\u返回的\u错误错误 在这种情况下,我总是得到一个CURLE\u couldn\u CONNECTcurl错误,HTTP响应代码是0 根据我的要求,我需要HTTP响应代码。请提出一些解决方案,谢谢 下面是我用来发布数据的API int http_curl_post_response(char *url, char *post_data, char *re

我使用的是libcurl 7.29.0

当服务器运行时,我的所有测试用例都正常工作,但是当服务器无法访问时,我收到一个
CURLE\u HTTP\u返回的\u错误
错误

在这种情况下,我总是得到一个
CURLE\u couldn\u CONNECT
curl错误,HTTP响应代码是
0

根据我的要求,我需要HTTP响应代码。请提出一些解决方案,谢谢

下面是我用来发布数据的API

int http_curl_post_response(char *url, char *post_data, char *response,
                            long int *responseCode) {
    CURL *ps_curl;
    CURLcode curl_status = CURLE_OK;
    struct curl_slist *headers = NULL; /* http headers to send with request */

    /* get a curl handle */
    ps_curl = curl_easy_init();
    if (ps_curl) {
        /* set content type */
        headers = curl_slist_append(headers, "Accept: application/json");
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "charsets: utf-8");

        /* This is to intialize respone from curl */
        http_curl_respone ps_response;

        curl_easy_setopt(ps_curl, CURLOPT_URL, url);

        curl_easy_setopt(ps_curl, CURLOPT_HTTPHEADER, headers);

        curl_easy_setopt(ps_curl, CURLOPT_POSTFIELDS, post_data);

        curl_easy_setopt(ps_curl, CURLOPT_POSTFIELDSIZE, -1L);

        curl_easy_setopt(ps_curl, CURLOPT_FOLLOWLOCATION, 1L);

        /* This is to read response from curl */
        curl_easy_setopt(ps_curl, CURLOPT_WRITEFUNCTION, write_response_json);

        init_response(&ps_response);
        if (ps_response.pi1_response == NULL) {
            i4_curl_status = MEM_ALLOC_ERROR;
            goto HTTP_CURL_ERROR;
        }

        curl_easy_setopt(ps_curl, CURLOPT_WRITEDATA, &ps_response);

        curl_easy_setopt(ps_curl, CURLOPT_FAILONERROR, 1L);

        /* Perform the request, i4_curl_status will get the return code */
        curl_status = curl_easy_perform(ps_curl);
        if (curl_status != CURLE_OK) {
            if (curl_status == CURLE_HTTP_RETURNED_ERROR) {
                curl_easy_getinfo(ps_curl, CURLINFO_RESPONSE_CODE,
                                  responseCode);
                /* always cleanup */
                curl_easy_cleanup(ps_curl);
            }
            goto HTTP_CURL_ERROR;
        } else {
            memcpy(response, ps_response.pi1_response, ps_response.s_len);
            response[ps_response.s_len] = '\0';
        }

        /* always cleanup */
        curl_easy_cleanup(ps_curl);
        /* free headers */
        curl_slist_free_all(headers);

    HTTP_MEM_ERROR:
        if (ps_response.pi1_response) free(ps_response.pi1_response);
    } else {
        curl_status = CURLE_FAILED_INIT;
    }

HTTP_CURL_ERROR:

    return curl_status;
}
。。。但是当服务器无法访问时,我会收到一个CURLE\u HTTP\u返回的\u错误。 在这个场景中,我总是得到一个CURLE\u COULDNT\u CONNECT curl错误,HTTP响应代码是0

如果服务器不可访问且连接失败,则检查响应代码甚至没有意义。是HTTP响应的属性。它被记录在HTTP响应(中)的一部分,HTTP服务器发回以响应
libcurl
代表您发送的HTTP请求。如果没有连接,服务器就没有收到您的请求,也没有响应

根据我的要求,我需要HTTP响应代码

如果没有连接,就没有响应,因此也就没有响应代码

在这种情况下,您可以将本地
responseCode
变量设置为
-1
,以指示连接失败:

*responseCode = -1;

您正在分配
i4\u curl\u状态
(顺便说一句,我看不到在任何地方被声明),但随后测试
curl\u状态
。这是打字错误吗?顺便说一句:我建议删除这个问题上的
node.js
c++
标记,如果可能的话,也许可以尝试更新版本的
libcurl
。(7.29版来自大约六年前:)@DavidCollins ya更正这是打字错误,功能方面没有问题。当服务器关闭或无法访问时,是否有可能出现404错误,因为我使用的每个post请求都是新连接。@Mehulpatel:在服务器没有实际响应的情况下,通过将本地
responseCode
变量设置为某个合法值(如404),可以“伪造”响应代码。但我认为这是一种误导——因为它可能会欺骗API用户,让他们认为连接实际上已经建立,即使它还没有建立。这就是为什么我建议在本例中使用
-1
:它不能与合法的状态代码混淆。我同意@DavidCollins的观点。对于这种情况,libcurl返回0,因为零也不能与合法状态混淆。所有正确的HTTP状态代码均为100或更大。