【问题标题】:cURL Returns Error Due to Too Many Threads (or Sockets?) [C]cURL 由于线程(或套接字?)过多而返回错误 [C]
【发布时间】:2014-07-30 04:28:25
【问题描述】:

我正在编写一个使用线程池的服务器。每个线程连接到一个 SQL 数据库,然后在同一个服务器套接字上调用accept,一旦它启动并等待客户端连接。我发现当且仅当我产生太多线程时,curl_easy_perform 函数在第一次被调用时就会失败,返回错误代码 56 (CURL_RECV_ERROR)。限制在 950 到 970 个线程之间,但我的计算机允许我为程序创建多达 2047 个线程,所以这个限制对我来说似乎是任意的。我的内存也不低。

只有一个线程在给我错误之前调用了一次 cURL 函数,所以在这个测试中我没有同时执行多个 cURL 请求。我做错了什么,还是我必须接受线程限制才能使 cURL 工作?

这些是我发送 HTTPS 请求和使用 cURL 获取响应的函数:

size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *s){ // callback function I have to use with Curl
    size_t new_len = s->len + size*nmemb;
    s->ptr = erealloc(s->ptr, new_len+1);
    memcpy(s->ptr+s->len, ptr, size*nmemb);
    s->ptr[new_len] = '\0';
    s->len = new_len;
    return size*nmemb;
}

char* curlHTTPS(char* url){ // returns the response as a string or NULL upon error
    url = strdup(url);
    CURL* curl = curl_easy_init();
    struct url_data* response = emalloc(sizeof(struct url_data));
    response->len = 0;
    response->ptr = emalloc(4096*sizeof(char));
    curl_easy_setopt(curl, CURLOPT_URL, url); // Define target site
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_HEADER, false);
    curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
    CURLcode curlCode = curl_easy_perform(curl);
    if (curlCode!=CURLE_OK){
        if (logLevel >= LOG_ERROR) printf("Curl failed! Error: %d\n", curlCode);
        curl_easy_cleanup(curl);
        efree(response->ptr);
        efree(response);
        return NULL;
    }
    char* ret = strdup(response->ptr);
    curl_easy_cleanup(curl);
    efree(response);
    return ret;
}

【问题讨论】:

  • 你在运行 Unix 吗?如果是这样,您是否检查过您的打开文件限制? stackoverflow.com/questions/880557/…
  • 我正在运行 Unix (OS X 10.8.5)。我刚查了一下:我的个人限制是256,我的系统限制是无限的。我想你找到了答案。现在,我让它只在调用accept 之后连接到 SQLite 数据库,并且它正在工作。另外,无论如何我都应该这样做以节省资源。
  • 我发现了一个与线程数无关的问题。一旦我修复它,我会看看它是否运行无错误......
  • 是的,正式解决了。如果你愿意,dohashi,你可以把你的评论作为答案,我会接受的。

标签: c multithreading curl


【解决方案1】:

听起来您打开了很多文件句柄。你检查过你的打开文件限制吗?

Socket accept - "Too many open files"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2012-09-07
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多