linux - 升压 asio 套接字不断弹出/proc/pid/fd

标签 linux sockets boost-asio

我确定套接字在我的应用程序中的任何地方都关闭了,并且我不断在我的/proc/pid/fd/下获取这个新创建的 fd/socket 文件,这是正常的。我确定不是。

connection.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)

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

我怎样才能确保我没有做错任何事

最佳答案

尝试在 connection::start 的顶部设置一个断点。然后当它被命中时,通过调试器中的调用堆栈来查看该方法在何处以及如何被调用以确定它是否符合预期。

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

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

关于linux - 升压 asio 套接字不断弹出/proc/pid/fd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829123/

相关文章:

android - 无法弄清楚为什么这个内核构建失败

c - 使用某些浏览器的网络应用程序出现问题

c++ - 我应该如何在我自己的函数中传递 boost::asio::yield_context?

sockets - 如何拆分接收到的 boost asio udp 套接字联合数据报

c - 母进程的安全 shm 分离

linux - Dstat 网络指标

python - Google SDK 实用程序中的 SSL 证书错误

python - 如何使用python将ZAP集成到jenkins?

java - 如何管理打开的数据报套接字以避免超过最大值?

c++ - 与慢消费者异步发送