2012-05-09 12 views
0

私は、TCPソケットを実装するためにboost asioを使用しています。私はチャットサーバーの例に従ってきました。ソケットサーバーを初めて実行したときに正常に動作します。イムは、このようにそれをやって:ブーストasioソケットは、停止後に接続できません。

 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のdoesntのショー)。後でもう一度呼び出してみるとエラーがスローされ、ポートはアップしています(netstatで見ることができます)が、接続はすべて受け入れられます(async_acceptは決して起きていません)。

私はio_serviceに関して何かがあると思いますが、makeメソッドが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)); 
     } 

そして受け入れるハンドル:それはio_service::reset()が呼び出されるまでrun(または類似)への呼び出しはすぐに戻りますことを述べ

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

     }else{ 

    activeSocketServer.onException(error); 
} 

答えて

0

the documentationで。

再度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(); 
      
    // ... 
   } 
+0

これを行うと、エラーコード125が返されます操作がキャンセルされました... – opernas

+0

あなたの 'StartAccept()'関数が1つの接続を受け入れると仮定すると、直ちに別の接続を受け入れることを試みますか?それが期待され、ハンドラは以前の 'stop()'呼び出しから実行されています。 – Chad

1

あなたが右の実行」の2回目の呼び出しの後に取得125 "は正常です。これは、Stopを呼び出したときに取り消された以前の保留中のハンドラです。それを取り除くための唯一の方法は、破壊と再作成io_service あるAFAIN (お使いの場合には、かかわらず、動的io_serviceを割り当てることが良いかもしれない、このanswerを参照してください)

新しい「async_accept」コールがまだ失敗する場合(アクセプタの作成に使用したと思いますか?)

関連する問題