0

我开发了一个将文件上传到 Dropbox 的应用程序。我正在使用 Libcurl (libcurl-7.21.7) 和 Openssl (0.9.8e) api 将文件上传到 Dropbox。我注意到有时我的应用程序由于服务器无响应而崩溃。我在控制台上遇到的错误是

SSL读取:错误:00000000:lib(0):func(0):reason(0),errno 131关闭连接#0

我已经在我的 POST 请求中实现了 CURL_TIMEOUT,但我仍然面临这个崩溃。如果超时时间很短,我会不断收到上传错误,如果时间太长,我会收到应用程序崩溃并出现上述错误。有没有办法解决请求中出现的问题以避免崩溃?

在调试中进一步发现崩溃实际上发生在 ssl 库中,因为应用程序崩溃了。

请问可以对此有所了解吗?

我使用的代码是:

CURL *curl;
curl = curl_easy_init();
    curl_global_init(CURL_GLOBAL_ALL);  
    curl_easy_setopt(curl, CURLOPT_CAINFO, NULL);           
    curl_easy_setopt(curl, CURLOPT_CAPATH, NULL);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_easy_setopt(curl, CURLOPT_URL,NOTIFICATIONURL);
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_FORBID_REUSE,1);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS,data());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, datalength);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    long int maxconnectiontime = 600;
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT,maxconnectiontime);
    long int maxtime = 1200;
    curl_easy_setopt(curl, CURLOPT_TIMEOUT,maxtime);

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    res = curl_easy_perform(curl);

    if(res)  
    {
            log("\n nCURL ERROR curl_easy_perform return %s [%d]",curl_easy_strerror(res),res);
    }  

    curl_slist_free_all(headers);
    curl_global_cleanup();
    curl_easy_cleanup(curl);
4

1 回答 1

0

该问题可以通过在客户端代码中添加信号“SIGPIPE”和SIGALRM“并忽略”来解决。

于 2013-08-12T10:53:04.380 回答