BOOST Webサイトにあるものを除いて、マルチスレッドクライアントに関する優れたチュートリアルはありますか?サーバーwhilistへのデータの送信を処理できるマルチスレッドクライアントは、サーバーが同時に送信しているものも出力します。例:ユーザーが入力してサーバーに送信するスレッド、およびソケットを処理してサーバーから情報を受信し、それをcoutに出力するスレッド。
1 に答える
あなたが提供したリンクは、boost::asioライブラリの使用方法に関する優れたガイドです。それがどのように機能するかを理解すれば、複数のスレッドなしであなたが望むことをすることができるでしょう。
asio(非同期IO)の考え方は、io_serviceオブジェクトによって操作が完了したら、コールバックすることです。aync_xxxを呼び出すときはいつでも、関数ポインター(またはファンクター)を渡します。これは、操作が完了すると呼び出されます。このように、IOのポーリングで個別のスレッドブロッキングを行う必要はありません。
たとえば、完了したらサーバーからメッセージを読み取りたいとします。do_something(Message&msg)を呼び出します。それはまさにサンプルコードがしたことです。
TCPは自然なメッセージ境界のないストリームベースのプロトコルであるため、独自のメッセージ形式を定義する必要があります。この例では、この目的のためにchat_messageクラスを定義しています。
メッセージを読み取るために、クライアントはこれらの手順に従います。各手順は、前のasync_xxx操作が実行された後のコールバックの結果としてトリガーされます。また、指定された正確なバイト数が読み取られた場合、またはエラーが発生した場合にのみasync_readが完了するという事実にも依存しています。
- async_connectを呼び出し、そのコールバックとしてhandle_connectを渡します。
- handle_connectはasync_readを呼び出し、そのコールバックとしてhandle_read_headerを渡します
- handle_read_headerはasync_readを呼び出し、そのコールバックとしてhandle_read_bodyを渡します。
- handle_read_bodyは最終的にasync_readを呼び出し、そのコールバックとしてhandle_read_headerを渡します。これにより、プロシージャは次のメッセージに対して繰り返されます。
サンプルでは、async_readを呼び出す前に、手順4で「cout.write...」を実行したことに注意してください。 「cout.wirte..」の部分をdo_something(msg)に置き換えるだけです。
書き込み部分は同様のコールバックのチェーンに従いますが、唯一の違いは、書き込むメッセージがなくなるとチェーンが切断されるため、条件を確認して再起動する必要があることです。