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