cURL 由于线程(或套接字?)过多而返回错误 [C]

标签 c multithreading curl

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

在出现错误之前,只有一个线程调用 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;
}

最佳答案

听起来您正在打开大量文件句柄。您检查过打开文件限制吗?

Socket accept - "Too many open files"

关于cURL 由于线程(或套接字?)过多而返回错误 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022464/

相关文章:

c# - 非 UI 线程之间的事件

c++ - cURL 超时问题

c - Printf 有时会写入额外的字符

c++ - 在保留原始索引的同时按值排序的更快方法

C:格式 '%s' 需要类型为 'char*' 的参数,但参数 2 的类型为 'char**'

java - 让线程 hibernate 不同的时间

C - SizeOf 指针

java - 何时使用 volatile 和 synchronized

php - cURL 返回 XML 或 JSON

django - request.META 不包含从curl -H 传递的 header