4

当我尝试使用 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:根本不允许,在一堆请求之后,一些网络霸主已经受够了并阻止了新的请求。

我必须承认,我的网络知识有限,无法在这里查明原因或找到解决方案。处理这样的任务的最佳方法是什么?任何帮助表示赞赏。

4

0 回答 0