刚刚学asio,写点小东西。一个人捣鼓在buff使用上走了许多歪路。总算开始会弄了。
遇到个小问题,决定还是先问问各位大大,还请大大们不吝赐教。问题是:
怎样取消一个io_service上注册的所有异步调用?我的代码基本抄的例程。请参考这个。
http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html
循环接收多个客户端连接,返回一些信息。区别只有我的会始终保持连接,用async_read_until先判断命令再回复。建立一个连接就创建一个tcp_connection对象。read出错时socket.shutdown(ip::tcp::socket::shutdown_both) socket.close(),然后tcp_connection对象自动销毁。比如我现在有10个客户端连接,都在async_read_until。我想暂停服务,io_service.stop(),但这么做只是停了事件循环,注册的async_read_until都没有取消。不进tcp_connection析构函数,也不给客户端发fin,连接不关闭,仅仅是服务器不响应而已。我想要的结果是立刻取消全部async_read_until进handle。
请问有便捷点的设置么?莫非我只能做个容器保存weak_ptr然后挨个调用shutdown close?……

解决方案 »

  1.   

    你把套接字close就会进入handle
      

  2.   

    io_service本来就不是只为套接字服务的,更别提帮你关套接字了。
      

  3.   

    m_socket_.shut_down(both);
    m_socket_.close();
      

  4.   

    定义一个connection_manager类,管理所有的tcp_connection,在io_service.stop()之前,shutdown, close管理器中的所有connection.
      

  5.   

    应该是bind function了shared_ptr导致没有析构