1

boost::asio の非同期読み取り/書き込み関数を使用して、接続しているクライアントと通信するサーバー アプリケーションがあります (クライアント側で切断されるまで)。

これまでのところすべて問題ありませんが、一定の時間が経過した後にサーバーが自分でパケットを送信する、ある種の時間指定メソッドを実装したいと思います。

私は主にboost::asio Webサイトのチュートリアル/例に従ったので、私のプログラムは基本的に与えられた例と同じ構造を持っています.

asio::deadline タイマー オブジェクトを作成し、次のように io_service.run() を呼び出して既に "呼び出した" io_service オブジェクトに渡すことで、この機能を実装しようとしました。

asio::deadline_timer t(*io, posix_time::seconds(200));
t.async_wait(boost::bind(&connection::handle_timed, 
                this, boost::asio::placeholders::error));

そして、handle_timed ハンドラーは次のようになります。

void connection::handle_timed(const system::error_code& error)
{
    //Ping packet is created here and gets stored in send_data

    async_write(socket_, asio::buffer(send_data, send_length), 
                boost::bind(&connection::handle_write, this, boost::asio::placeholders::error));
}

ただし、私が抱えている問題は、deadline_timer が指定された時間を待機しないことです。彼はほとんどすぐにハンドラー関数に入り、パケットを送信したいと考えています。

彼は非同期操作に到達するとすぐに処理するようですが、それは私が望んでいることではありません。

io_service.run() で呼び出された後、新しい「オブジェクト」を io_service オブジェクトに追加できないのでしょうか? それとも、後で io_service オブジェクトの作業キューに具体的に含める必要があるのでしょうか?

また、私が持っている通常のメッセージ トラフィックと混同せずにこれを実装する方法を理解するのに苦労しています。

4

1 に答える 1

1

io_serviceいつでもに作業を追加できます。コールバックのエラーを確認する必要があります。範囲外のasync_wait()ように見えますdeadline_timer

asio::deadline_timer t(*io, posix_time::seconds(200));
t.async_wait(boost::bind(&connection::handle_timed, 
                this, boost::asio::placeholders::error));
...
// t goes out of scope here

connectionのようにクラスのメンバーにする必要がありますsocket_。または、完了ハンドラーでコピーを使用boost::enable_shared_from_thisして保持します。

const boost::shared_ptr<asio::deadline_timer> t(new asio::deadline_timer(*io, posix_time::seconds(200)));
t.async_wait(boost::bind(&connection::handle_timed, 
                this, boost::asio::placeholders, t));

そしてあなたの完了ハンドラ

void connection::handle_timed(
    const system::error_code& error,
    const boost::shared_ptr<asio::deadline_timer>& timer
    )
{
    //Ping packet is created here and gets stored in send_data

    async_write(socket_, asio::buffer(send_data, send_length), 
                boost::bind(&connection::handle_write, this, boost::asio::placeholders::error));
}
于 2013-01-13T22:50:50.843 に答える