boost asio套接字在/proc/pid/fd下不断弹出



我确信我的应用程序中的所有套接字都被关闭了,我一直在我的/proc/pid/fd/下获取这些新创建的fd/socket文件,这很正常。我肯定不是。

连接.cpp

 connection::start() {
    socket_.set_option(boost::asio::ip::tcp::no_delay(true));
    boost::asio::socket_base::non_blocking_io command(true);
    socket_.io_control(command);
    read_header();
    longevity_timer_.start();
    // log_->debugStream() << "listening";
  }
void connection::stop() {
    cancel_timeout();
    boost::system::error_code ignored_ec;
    // initiate graceful connection closure & stop all asynchronous ops
    try {
      socket_.cancel();
      socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);
      if (ignored_ec)
      {
          log_->errorStream() << "shutdown: bad socket; couldn't close cleanly" << ignored_ec.message();    
      }
      socket_.close(ignored_ec);
      if (ignored_ec)
      {
          log_->errorStream() << "close: bad socket; couldn't close cleanly" << ignored_ec.message();    
      }
    } catch (std::exception& e) {
      log_->errorStream() << "bad socket; couldn't close cleanly";
    }
} 

lsof-p pid

dakwakd 20733 root   18u  IPv4 647843      0t0      TCP localhost:35654->localhost:amqp (ESTABLISHED)
dakwakd 20733 root   19u  IPv4 647969      0t0      TCP localhost:35695->localhost:amqp (ESTABLISHED)
dakwakd 20733 root   20u  IPv4 647599      0t0      TCP localhost:35543->localhost:amqp (ESTABLISHED)
dakwakd 20733 root   21u  IPv4 647634      0t0      TCP localhost:35567->localhost:amqp (ESTABLISHED)

现在,每次我获得新的连接时,我都会确保在完成连接后停止连接。但是在/proc/pid/fd/下,fd/socket文件仍然快速增长

我如何才能确保我没有做错任何事情

尝试在连接::start的顶部设置断点。然后,当它被击中时,通过调试器中的调用堆栈,查看在哪里以及如何调用该方法,以确定它是否如预期的那样。

在stop方法中,尝试将cancel_timeout()移动到try/catch块内,因为如果代码现在抛出,则不会捕获或记录错误。

尝试在启动和停止的顶部添加一个调试调用到log_->errorStream()。打印出_socket对象的地址——我假设它是唯一的,并在其他地方为每个新连接创建。确保对于start方法中的每个调试打印语句,在stop方法中都会看到相应的调试打印语句以及_socket对象的正确地址。我怀疑它们不会匹配,并且由于某种原因,您的stop方法没有被正确调用。如果这是真的,那么您将需要调查和调试为什么没有调用stop方法来关闭连接。

最新更新