2

アプリケーションのどこでもソケットが閉じられていると確信しており、/ 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/の下でまだ急速に大きくなります

どうすれば私が何か悪いことをしていないことを確認できますか

4

1 に答える 1

1

connection::startの上部にブレークポイントを設定してみてください。次に、ヒットしたときに、デバッガーの呼び出しスタックを調べて、メソッドがどこでどのように呼び出されるかを確認し、期待どおりかどうかを判断します。

stopメソッドで、try / catchブロック内にcancel_timeout()を移動してみてください。これは、コードが現在スローされた場合、エラーをキャッチまたはログに記録しないためです。

startとstopの両方の先頭にあるlog_->errorStream()にデバッグ呼び出しを追加してみてください。_socketオブジェクトのアドレスを出力します。これは一意であり、新しい接続ごとに別の場所で作成されると思います。startメソッドの各debugprintステートメントについて、対応するdebugprintステートメントが_socketオブジェクトの正しいアドレスでstopメソッドに表示されることを確認してください。それらが一致せず、何らかの理由でstopメソッドが適切に呼び出されていない可能性があります。これが当てはまる場合は、接続を閉じるためにstopメソッドが呼び出されない理由を調査してデバッグする必要があります。

于 2013-02-12T14:40:28.030 に答える