【问题标题】:Boost ASIO socket consumes file descriptorsBoost ASIO socket 消耗文件描述符
【发布时间】:2012-10-16 07:02:27
【问题描述】:

我正在使用 Boost ASIO 套接字与 linux 下的一些远程设备进行通信,但是当端点无法访问时我遇到了问题。首先,这是显示此问题的代码部分:

try {
   if(mysocket == NULL)
   {
      mysocket = new boost::asio::ip::tcp::socket(io_service);
   }
   mysocket->connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("192.168.0.12"), 1));
   printf("connected\n");
   return 0;
}
catch (std::exception &e)
{
   boost::system::error_code ec;
   mysocket->close(ec);
   delete mysocket;
   mysocket = NULL;
   printf("not connected %s\n", e.what());
}

通过在我的类中使用这段代码,我得到了越来越多的 eventfd 类型的文件描述符,直到所有可用的 fd 都被使用并且应用程序崩溃。上面的代码有问题吗?为什么 boost 不关闭文件描述符?我什至删除了套接字! 提前致谢!

【问题讨论】:

  • 我尝试在无限循环中运行你的代码,它不会导致任何资源泄漏(boost 1.51、MSVC10、Win7)。能否请您详细说明您的真实情况?
  • 我想我解决了这个问题,它不应该与boost有关,而是与其他人的代码没有在基类中使用虚拟析构函数有关!这阻止了一些清理工作,从而留下了一些东西。不确定这是否能解决问题,得先测试一下,但我想我做得很好!
  • 你确定你没有泄漏内存吗?为什么不使用std::shared_ptr 而不是裸mysocket 指针?
  • @SamMiller 感谢您的评论,实际上新套接字不断创建,虚拟析构函数成功了!
  • @cpl 请添加答案,以便其他遇到此问题的人知道解决方案

标签: c++ linux boost boost-asio


【解决方案1】:

问题是由于没有释放资源,例如 boost 套接字。这些套接字留下了打开的文件,逐渐达到我系统中的打开文件限制,因此尝试打开其他文件导致错误。实际异常是由 boost UUID 生成器引发的,它无法打开文件!

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 2020-02-27
    • 2011-06-08
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多