升压 ASIO 插座在停止后无法连接
boost asio sockets cant connect after stop
我使用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的事情,但如果在停止方法中进行重置,并且抛出错误 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);
}
在文档中,它指出对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();
// ...
}
在第二次调用"run"后立即得到的 125 是正常的:它是您调用 Stop 时被取消的上一个挂起处理程序。AFAIN 摆脱这种情况的唯一方法是销毁并重新创建io_service(请参阅此答案,在您的情况下,最好动态分配io_service)
如果新的"async_accept"调用仍然失败,您可能需要重新初始化接受器(关闭然后打开/绑定/侦听)...因为您重新创建了端点(我猜您用来构造接受器?
相关文章:
- 提升 ASIO - io_service 不要等待连接到线程
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 断开连接后重新连接boost beast(asio)websocket和http连接时出错
- 提升 ASIO 服务器 - 检测空闲连接
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- 如何在 boost asio 中检测套接字上的关闭连接,而无需阻塞调用
- 在写入过程中立即使用boost::asio检测关闭的TCP连接
- boost :: Asio连接错误的界面
- boost::asio 允许非阻塞接受新连接,而连接的处理程序正在阻塞
- Boost.Asio 异步服务器.限制为一个连接
- Boost::ASIO:针对最小流量、长连接、小消息、即时传递进行优化
- 尝试使用 boost::asio 连接到 SOCKS 5 服务器,但我的连接请求格式不正确
- 在boost asio tcp套接字上接受多个连接
- 如何通过 boost asio 支持 TCP 服务器中的多个连接
- boost::asio::async_connect 不仅创建一个 TCP 连接,还创建两个
- 提升安卓 Asio 连接错误
- 为什么提升 asio udp 连接会抛出"send: Connection refused"?
- 为什么 read() 在管道连接到使用 boost::asio for STDIN/STDOUT 的程序时,使用 EAG
- ASIO-检测死连接
- 在 Asio 中建立新连接时出现"Already Open"错误