提升asio套接字不断弹出/ proc / pid / fd

时间:2013-02-12 09:18:33

标签: 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 /

下仍然快速增长

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

1 个答案:

答案 0 :(得分:1)

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

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

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