0

TCPソケットを実装するためにboostasioを使用しています。チャットサーバーの例に従いました。初めてソケットサーバーを実行すると、問題なく動作します。私はこのようにそれをやっています:

     void ActiveSocketServer::run() throw (ActiveException){

     initBoost();

     server->startAccept();

     t=new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service));
    }

    void ActiveSocketServer::initBoost(){

       if (isIpV6){
            endpoint=new tcp::endpoint(tcp::v6(), port);
       }else{
            endpoint=new tcp::endpoint(tcp::v4(), port);
       }
       server=new ActiveSocketServerConnection(io_service,
                    *endpoint,
                    port,
                    id,
                    maxSizePacket,
                    this);

}

開始後、次のように記述されたstopメソッドを呼び出します。

 void ActiveSocketServer::stop(){
     io_service.stop();
     if (t){
        t->join();
        delete t;
        t=NULL;
      }

      if (endpoint){
        delete endpoint;
        endpoint=NULL;
      }

      if (server){
         delete server;
         server=NULL;
      }
   }

この後、ポートは起動しません(netstatは表示されません)。後で、もう一度runを呼び出そうとすると、エラーがスローされ、ポートは起動しますが(netstatで確認できます)、接続はすべて受け入れられます(async_acceptは起動しません)。

それはio_serviceの問題かもしれないと思いますが、stopメソッドでリセットするとエラー125(操作解除)がスローされます。

何か案が?


はい、startAcceptを呼び出すと同時に、新しい接続を受信して​​いますが、エラー125が発生します。これは正常ですか?どこでそれについて何かを読むことができますか?

私のstartAccept:

   void ActiveSocketServerConnection::startAccept(){

       sessionId++;

        newSession=new ActiveSocketServerSession(   io_service_,
                        getPort(),
                        getId(),
                        maxSizePacket,
                        activeSocketServer,
                        sessionId);

        acceptor_.async_accept( newSession->socket(),
                 boost::bind(&ActiveSocketServerConnection::handleAccept, 
                         this, newSession,
                 boost::asio::placeholders::error));
        }

そしてハンドルは受け入れます:

   void ActiveSocketServerConnection::handleAccept(ActiveSocketServerSession* newSession,
                                                          const boost::system::error_code& error){
     if (!error){
       newSession->start();

         }else{

    activeSocketServer.onException(error);
}
4

2 に答える 2

1

"run" の 2 回目の呼び出しの直後に表示される 125 は正常です。これは、Stop を呼び出したときにキャンセルされた、前の保留中のハンドラーです。AFAINそれを取り除く唯一の方法は、io_serviceを破棄して再作成することです(この回答を参照してください。ただし、io_serviceを動的に割り当てる方がよい場合があります)

新しい「async_accept」呼び出しがまだ失敗する場合は、アクセプターを再初期化 (閉じてから開く/バインド/リッスン) したいかもしれません...エンドポイントを再作成するためです (アクセプターを構築するために使用したと思いますか?)

于 2013-08-22T07:30:18.757 に答える
1

ドキュメントでは、(または同様の)への呼び出しは、が呼び出されるrunまですぐに戻ると記載されていio_service::reset()ます。

もう一度電話する予定がある場合は、次のようなrun「プライミング」に害はないと思います。io_service

void ActiveSocketServer::stop(){
     io_service.stop();

     // prime to make ready for future run/run_one/poll/poll_one calls
     io_service.reset();
     
     // ...
   }
于 2012-05-09T17:18:55.700 に答える