0

我正在尝试编写一个简单的服务器来异步发送消息,但是我的 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();
}

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

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

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

4

1 回答 1

3

如果您真的想要手动,请在完成一些工作后执行此操作,poll并在迭代之间调用。io_servicereset

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

于 2013-06-02T08:41:13.167 回答