Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.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
由于线程(或套接字?)过多,cURL返回错误[C]_C_Multithreading_Curl - Fatal编程技术网

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

由于线程(或套接字?)过多,cURL返回错误[C],c,multithreading,curl,C,Multithreading,Curl,我正在编写一个使用线程池的服务器。每个线程连接到SQL数据库,然后在启动并等待客户端连接后,在同一服务器套接字上调用accept。我发现,当且仅当我产生太多线程时,curl\u easy\u perform函数在第一次调用时就会失败,返回错误代码56(curl\u RECV\u error)。限制在950到970个线程之间,但是我的计算机允许我为程序创建多达2047个线程,所以这个限制对我来说似乎是任意的。我的内存也不低 只有一个线程在给出错误之前调用了cURL函数一次,所以在这个测试中我不会同

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

只有一个线程在给出错误之前调用了cURL函数一次,所以在这个测试中我不会同时执行多个cURL请求。我是否做错了什么,或者我必须接受卷曲工作的线程限制

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

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吗?如果是,您是否检查了打开的文件限制?我正在运行Unix(OSX10.8.5)。我刚刚检查过:我的个人限额是256,我的系统限额是无限的。我想你找到了答案。现在,我让它只在调用了
accept
之后才连接到SQLite数据库,并且它正在工作。另外,无论如何我都应该这样做以节省资源。我发现有这么多线程存在一个不相关的问题。一旦我修复了它,我会看看它是否没有bug…是的,它已经正式解决了。如果你愿意,多哈希,你可以把你的评论作为回答,我会接受的。