c++ - Boost ASIO套接字消耗从未清除的文件描述符

标签 c++ boost

我正在使用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类型的文件描述符,直到使用了所有可用的fds且应用程序崩溃为止。上面的代码有什么问题吗?为什么boost没有关闭文件描述符?我什至删除套接字!提前致谢!

最佳答案

就像其他人说的那样,只是不要编写newdelete,并且您知道自己并没有弄乱它。

特别是您的误导

mysocket->close(ec);

会因为套接字未首先打开而抛出,所以您从未到达delete

但是,mysocket可以在作用域末尾自动销毁:
整个代码可以简化为:
#include <boost/asio.hpp>
#include <iostream>
namespace ba = boost::asio;
using ba::ip::tcp;

int main() {
    ba::io_context io_service;
    try {
        tcp::socket mysocket(io_service);
        mysocket.connect({ba::ip::address::from_string("192.168.0.12"), 1});
        std::cout << "Connected to " << mysocket.remote_endpoint() << "\n";
    }
    catch (boost::system::system_error const& se) {
        std::cout << "System error: " << se.code().message() << "\n";
    }
}

关于c++ - Boost ASIO套接字消耗从未清除的文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61687585/

相关文章:

c++ - 循环依赖难题

c++ - 使用异步调用与在线程中使用同步调用相同吗?

c++ - 在 boost asio 中为异步操作的函数处理程序分配线程的困难

c++ - boost::scoped_array 上的_BLOCK_TYPE_IS_VALID 错误

c++ - std::unordered_map 内部使用哈希吗?

c++ - C/C++ Matlab 编译器与 MKL

c++ - 如何计算多重映射中重复对的数量

c++ - 谁负责删除?

c++ - Boost.asio使用协程实现多个连接的echo服务器

c++ - 监控 C++11 和 C++03 中的类实现?