2012-03-09 12 views
0

私はBoost Asioの助けを借りてC++でクライアント/サーバーアプリケーションを作成しています。私は働いているサーバーがあり、サーバーのワークフローは私がよく理解しているものです。ブーストAsioでTCPソケット上で非同期書き込み操作を実行

クライアントアプリケーションは、Asioの例に示すように正常に接続を処理します。その後、サーバーとのハンドシェイクが交換されます。しかし、その後、ユーザーはサーバーに要求を送信できなければなりません。これは、パラダイムを理解する上で問題があります。

初期ワークフローは、このように少しのようになります:

OnConnected() { SendHandshake() } 
SendHandshake() { async.write_some(handshake...), async_read_some(&OnRead) } 
OnRead() { ReadServerHandshake() *** } 

とユーザーの書き込み(MSG)を使用してメッセージを送信します:

Write (msg) { async_write_some(msg,&OnWrite), async_Read_some(&OnRead) } 
OnWrite() {} 

EDIT:をより明確にするために、質問を言い換え

初期ハンドシェイクが完了した後、クライアントはservに要求を送信するためにのみ使用されますそれは返事を得るでしょう。したがって、たとえば、ユーザーが書き込みを送信します。クライアントは読み取り操作が完了するのを待って、応答を読み取り、何かを実行します。次のユーザー書き込みは、例えば5分後にのみ行われます。最後の返信読み取りと次の書き込みの間に未処理の非同期操作がないため、io_serviceはその間に動作しますか?

答えて

0

io_service::workを参考にして、io_serviceの不足を防止することができます。これにより、作業オブジェクトが破棄されるまでio_service::runが返されないことが保証されます。 作業オブジェクトの有効期間を制御するには、作業が完了したらshared_ptrポインターを使用してリセットしたり、hereのようにboost::optionalを使用したりできます。

もちろん、サーバーがTCP接続を閉じるか、何らかの理由で接続が切断される場合も処理する必要があります。このケースを処理するには、サーバーへのソケットに未処理のasync_readを置くことです。接続に何か問題が生じた場合は、/を読むハンドラはerror_codeで呼び出す必要があります。接続で未処理の読み取りがある場合は、作業オブジェクトを使用する必要はありません。

+0

私はこれを試してみます、ありがとうございます。 – skali

0

IOサービスで読み取りを完了させる場合は、読み取りを開始する必要があります。クライアントがそれを送信するたびにデータを読み取る場合は、常に非同期読み取り操作を保留しておく必要があります。さもなければ、図書館はどのようにしてデータをどうするのかを知っていますか?

+0

私は、サーバーからの応答を期待している場合、未解決の非同期読み取りを持たせる必要があることを理解しています。私はWriteメソッドでそれをやっています。 書き込みの読み取りサイクルが完了してから、ユーザーが再度書き込みを行うまでに時間がかかる場合、io_serviceは処理する必要がないため、その間に終了しますか? – skali

+0

しかし、それはやるべき仕事を持っていました。それは未解決の非同期読み込み要求を完了しようとしていました(それでもなお)。非同期要求を行うことは、io_serviceに何かをさせる方法の1つです。 –

+0

私は読書が終わった後を意味します。ですから、async_read - > OnReadハンドラが呼び出された後に、他の非同期操作を呼び出さないでください。次の書き込みが開始されるまで、ソケットに未処理の読み取りまたは書き込みはありません。 io_serviceの動作が停止しますか? – skali

関連する問題