不会调用Boost asio async_write回调

时间:2013-06-01 15:10:14

标签: c++ boost asynchronous boost-asio

我正在尝试编写一个简单的服务器来异步发送消息,但我的async_write回调不会被调用。顺便说一句,数据成功传输到客户端。

Firs,我的服务器初始化代码:

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();
}

我的开始接受并接受处理程序方法:

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);
    }
}

我可以看到std out出现“异步写入”消息,客户端也会收到数据。我的handleSend方法现在只是一些cout,但它永远不会被调用。为什么呢?

1 个答案:

答案 0 :(得分:2)

如果您真的想poll手动io_service,请在之后执行此操作,然后致电reset between the iterations。< / p>

此外,不要在循环中调用asio::async_write - 数据不会以正确的顺序到达。相反,要么准备一个缓冲区序列并立即发送它,要么链async_write - 完成处理程序 - async_write,如示例所示。