1

Linux で一部のリモート デバイスと通信するために Boost ASIO ソケットを使用していますが、エンドポイントに到達できない場合に問題が発生します。まず、この問題を示すコードの一部を次に示します。

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());
}

クラス内でこのコードを使用すると、使用可能なすべての fd が使用されてアプリケーションがクラッシュするまで、eventfd 型のファイル記述子の数が増加します。上記のコードに問題はありますか?ブーストがファイル記述子を閉じないのはなぜですか? ソケットも削除します!前もって感謝します!

4

1 に答える 1

1

この問題は、ブースト ソケットなどのリソースを解放していないことが原因でした。これらのソケットはファイルを開いたままにし、システムで開いているファイルの制限に徐々に達したため、追加のファイルを開こうとするとエラーが発生しました。実際の例外は、ファイルを開くことができなかったブースト UUID ジェネレーターによってスローされました!

于 2012-10-26T08:55:20.847 に答える