curl_easy_init失败时如何获取错误原因

gol*_*tar 1 c c++ libcurl

失败时是否可能获得错误代码(如errno)或错误描述(如curl_easy_strerrorcurl_easy_init

Dav*_*ins 5

不可以。无法找到原因。从库版本7.58.0的源代码...

struct Curl_easy *curl_easy_init(void) {
    CURLcode result;
    struct Curl_easy *data;

    // Etc..

    result = Curl_open(&data);
    if (result) {
        DEBUGF(fprintf(stderr, "Error: Curl_open failed\n"));
        return NULL;
    }

    return data;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果Curl_open(...)失败,该库只会输出错误并中止:它不会修改任何状态变量,例如errno您以后可以检查以确定状态的原因。

但是,如果呼叫对您失败,则可能是因为curl_global_init()失败。curl_easy_init()如果您自己事先不调用它,则会自动调用它。curl_global_init()-不像 curl_easy_init()-确实会返回错误代码。

这个故事告诉我们......
呼叫curl_global_init(...)和呼叫前检查它的返回值curl_easy_init()。不要依靠curl_easy_init()自动进行。

这至少可以让你辨别是否curl_global_init(...)Curl_open()失败。

例如

CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
if (res != 0) {
    fprintf("Failed global init ...\n");
    exit(1);
}
CURL *curl = curl_easy_init();
if (!curl) {
    ///
}

// Etc.

curl_easy_cleanup(curl);
curl_global_cleanup();
Run Code Online (Sandbox Code Playgroud)