我使用 boost asio 来实现 TCP 套接字。我遵循了聊天服务器示例。我第一次运行套接字服务器时它工作正常。我这样做是这样的:
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。这正常吗?我在哪里可以阅读有关它的信息?
我的开始接受:
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);
}