提升 asio async_write回调未被调用

Boost asio async_write callback doesn't get called

本文关键字:调用 回调 write asio async 提升      更新时间:2023-10-16

我试图写一个简单的服务器异步发送消息,但我的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,如示例所示。