メッセージを非同期で送信する単純なサーバーを作成しようとしていますが、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 メソッドは今ではほんの一部ですが、呼び出されることはありません。なんで?