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 メソッドは今ではほんの一部ですが、呼び出されることはありません。なんで?

4

1 に答える 1

3

本当に手動でやりたい場合はpoll、作業が終わってからこれを行い、反復の間に呼び出します。io_servicereset

asio::async_writeまた、ループで呼び出さないでください。データは正しい順序で到着しません。代わりに、例に示すように、バッファの単一シーケンスを準備して一度に送信するか、チェーンasync_write- 完了ハンドラ -を使用してください。async_write

于 2013-06-02T08:41:13.167 に答える