当我尝试使用 curlpp 执行大量同步 https 请求时,出现以下错误:
无法连接到https://www.google.com/端口 443:没有路由到主机
下面的代码当然只是实际代码的精简、清理示例。网址不同,但结果是一样的。
void ThreadFunction()
{
try
{
curlpp::Cleanup myCleanup;
std::ostringstream os;
os << curlpp::options::Url("https://www.google.com/");
}
catch( curlpp::RuntimeError &e )
{
std::cout << e.what() << std::endl;
}
catch( curlpp::LogicError &e )
{
std::cout << e.what() << std::endl;
}
}
int main(void)
{
thread threads[10];
int loops = 0;
while(loops < 3000)
{
for(int i = 0; i < 10; i++)
{
threads[i] = thread(ThreadFunction);
}
for(int i = 0; i < 10; i++)
{
threads[i].join();
}
loops++;
}
return 0;
}
错误不是从一开始就直接发生,而是在循环 ~1000 左右发生。之后,每个请求都会生成此错误。我尝试为每个线程使用不同的端口(如 80),但 curlpp 似乎只使用端口 443 执行 https 请求。当只运行一个线程时,一切似乎都很好(除了它花费的时间太长,因此需要多个线程)。
所以我的理论A:实际上可以像这样执行同步请求,但是我错过了请求后端口的一些关闭/清理。(我的意思是,它适用于前 ~1000 * 10 个请求)
理论 B:不可能同时在同一个端口上执行请求,但是线程恰好在稍微不同的时间使用同一个端口(直到它不是,在 ~1000)
或者 C:根本不允许,在一堆请求之后,一些网络霸主已经受够了并阻止了新的请求。
我必须承认,我的网络知识有限,无法在这里查明原因或找到解决方案。处理这样的任务的最佳方法是什么?任何帮助表示赞赏。