提升 asio async_write回调未被调用
Boost asio async_write callback doesn't get called
我试图写一个简单的服务器异步发送消息,但我的async_write回调没有被调用。顺便说一下,数据被成功地传输到客户端。
首先,我的服务器初始化代码:void Server::start()
{
ioService = new boost::asio::io_service();
acceptor = new tcp::acceptor(*ioService, tcp::endpoint(tcp::v4(), port));
serverRunning = true;
serverThread = new boost::thread(&Server::run, this);
startAccept();
}
我的start accept和accept处理程序方法:
void Server::startAccept()
{
serverSocket = new tcp::socket(acceptor->get_io_service());
acceptor->async_accept(*serverSocket,
boost::bind(&Server::handleAccept, shared_from_this(),
boost::asio::placeholders::error));
}
void Server::handleAccept( const boost::system::error_code& error )
{
changeState(Connected);
}
handleAccept方法在我连接时被调用,changeState方法现在什么都不做。客户端连接后,我将一些数据放入toSend
向量,服务器线程发送它们:
void Server::run(){
while( serverRunning ){
ioService->poll();
if (toSend.size()>0 ){
mtx.lock();
for (int i=0; i<toSend.size(); i++){
cout << "async write" << endl;
boost::asio::async_write(*serverSocket, boost::asio::buffer(toSend.at(i)),
boost::bind(&Server::handleSend, shared_from_this(),
toSend.at(i),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
toSend.clear();
mtx.unlock();
}
usleep(1000);
}
}
我可以看到"async write"消息从std输出,客户端也接收到数据。我的handleSend方法现在只是一些计数,但它永远不会被调用。为什么?
如果您真的想手动poll
io_service
,在得到一些工作后执行,并在迭代之间调用reset
。
此外,不要在循环中调用asio::async_write
——数据不会以正确的顺序到达。相反,要么准备一个缓冲区序列并立即发送,要么链接async_write
-完成处理程序- async_write
,如示例所示。
相关文章:
- 用于在回调中调用解析器的设计模式
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 处理类内的回调时,必须调用对非静态成员函数的引用
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- LIBEV 非阻滞套接字连续调用回调
- 共享指针和回调注册的结构.由于我之外的原因调用回调时,原始指针值发生了变化
- 统一处理具有协变类型的函数指针(如何使用派生类型调用回调?
- 在本机节点中的回调中调用回调
- boost asio,async_read和acync_write未调用回调
- cuda流:流执行后未调用回调
- VDS(虚拟磁盘服务)COM接口通知-仅在注销期间调用回调(接收器)(Unadvise)
- 提升 ASIO,async_read_some未调用回调
- 如何在成员函数线程中调用回调
- 从c++向目标c调用回调函数
- c++调用回调后删除对象
- 可调用(回调)作为类模板参数的模板
- 在异步API (c++)中,如何保证API在调用回调之前返回
- 装饰器模式:如何从核心类中调用(回调)装饰器包装器的一些成员
- Cython使用python-c-api调用回调segfault
- 为什么boost asio async_read_some在特定情况下不调用回调