私は、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);
}
これを行うと、エラーコード125が返されます操作がキャンセルされました... – opernas
あなたの 'StartAccept()'関数が1つの接続を受け入れると仮定すると、直ちに別の接続を受け入れることを試みますか?それが期待され、ハンドラは以前の 'stop()'呼び出しから実行されています。 – Chad