我正在尝试编写一个简单的服务器来异步发送消息,但我的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,但它永远不会被调用。为什么呢?
答案 0 :(得分:2)
如果您真的想 此外,不要在循环中调用poll
手动io_service
,请在之后执行此操作,然后致电reset
between the iterations。< / p>
asio::async_write
- 数据不会以正确的顺序到达。相反,要么准备一个缓冲区序列并立即发送它,要么链async_write
- 完成处理程序 - async_write
,如示例所示。