2017-01-04 12 views
2

私はboost asioでグリップを取得しようとしていますが、私は非同期インターフェイスの背後にあるいくつかの動作を理解するのに問題があります。TCP TXバッファがいっぱいになると、boost :: asioはどうなりますか?

私はクライアントとサーバーで簡単な設定をしています。

  • クライアントは、サーバーがデータのポーリングを停止したときに何が起こるのデータ
  • 定期的にデータ用のサーバーをポーリング
  • 一定量のasync_write定期的に呼び出しますか?

さまざまなバッファがサーバーOSでいっぱいになり、ACKの送信が停止すると思いますか?

何が起こっても、クライアントは何らかのエラーコールバックを受信せずに数ギガバイトのデータを幸せに送信し続けることができるように思われます。

私はクライアントOSがTX'edできないので、ある時点でパケットの受け入れを停止すると仮定しますか?

これは、boost :: asioがデータを内部的にバッファリングすることを意味しますか?

もしそうなら、私は配信を待たないためにsocket.cancel()を使ってパケットをドロップできますか? (私はASIOが私のパケットについて忘れて、新しいパケットに古いバッファを再利用できるようにする必要があります)

答えて

2

asioは内部的にバッファしません。さらに多くのデータをリモートに転送できない場合は、常に信号が送られます。

など。 asioで同期書き込みを使用すると、データが送信される(または少なくともカーネルの送信バッファにコピーされる)までブロックされます。非同期書き込みを使用すると、コールバック/確認応答は一度送信できると呼び出されます。ノンブロッキング書き込みを使用すると、EAGAIN/WOULD_BLOCKエラーが発生します。あなたは、並列に複数のasync_write年代を使用する場合 - も - あなたはそれを行うべきではありません、それは行動がASIOドキュメントに応じて定義されています:

この操作は、ストリームのasync_write_some関数にゼロ個以上のコールの面に実装され、複合操作として知られています。プログラムは、この操作が完了するまで、ストリームが他の書き込み操作(async_write、ストリームのasync_write_some関数、または書き込みを実行するその他の合成操作など)を実行しないようにする必要があります。

アプリケーションでは、常に1つの非同期書き込み操作のみを実行し、次のデータ書き込みを完了することを保証します。その間にデータを書き込む必要がある場合は、アプリケーション内でデータをバッファリングする必要があります。

+0

詳細な回答と「時間の一回限りのコール」の先頭に感謝します。将来の参照のために、この回答http://stackoverflow.com/a/1998127/2510141も少しの洞察を提供します。 – user2510141

関連する問題