1

TCP サーバーがあり、同時に多くのソケットにデータを送信する必要があります。そのためにブーストを使用しています。

複数のソケットにデータを送信する必要がある場合は、送信したいデータを使用して各ソケットを呼び出しboost::asio::async_writeます。

boost::asio::async_writeあるソケットで呼び出してコールバックを待つことに違いと利点があるかどうか疑問に思っていました(そして、次のソケットで呼び出します...)

4

3 に答える 3

2

async_write からのコールバックを待っても、(本質的にランダムな) 遅延が発生するだけで、何のメリットもありません。

唯一の例外は、基になるプロトコルに輻輳制御がない場合です。つまり、UDP を使用する場合、おそらくアプリケーションにある種の輻輳制御を実装する必要がありますが、それでも async_write コールバックを待つのは適切ではありません。アイデア (これは、データがオペレーティング システムに渡されたことを示しているだけです)。

しかし、TCP を使用しているため、コールバックを待っても何のメリットもありません。

于 2012-09-28T18:21:19.437 に答える
1

WriteHandlerは、async_write操作でエラーが発生した場合、またはすべてのデータがソケットに書き込まれた場合に実行可能です。したがって、異なるソケット間で複数の非同期書き込みを発行すると、速度が向上する可能性があります。ただし、バッファを適切に管理するには、さらに注意が必要です。

  • バッファが によって管理されている場合はshared_ptr、単純にshared_ptrを各WriteHandlerにバインドします。
  • バッファーがスマート ポインターによって管理されていない場合は、最後のWriteHandlerがいつ呼び出されたかを検出するメカニズムが必要です。保留中の書き込みハンドラーの数をpending_writes_変数に格納し、各WriteHandlerをデクリメントすることを検討してくださいpending_writes_pending_writes_ゼロになると、バッファは他の操作に再利用できます。への変更をシリアル化するにpending_writes_は、各WriteHandlersstrand.
于 2012-10-02T14:23:07.283 に答える
1

私はネットワークの専門家ではないので、ここで何か問題があれば遠慮なくコメントしてください。

非同期:

  • 非同期呼び出しを行う利点は、呼び出しの直後に制御が返されることです。そのため、呼び出しのステータスを確認するのを待っている間に、他のより生産的なことを行ったり、CPU を解放したりできます。これにより、非同期システムが効率的になります。

  • 短所は、非同期呼び出しを行うのが難しいことです。呼び出しの結果を通信するためのロックやメカニズムは必要ありません。これは、実装が非常に難しい場合があります。

同期:

  • 同期呼び出しを行う利点は、実装と理解が容易になることです。

  • 欠点は、結果が得られるまでブロックされることです。これにより、システムが非常に遅くなり、デッドロックが発生する可能性があります。

于 2012-09-28T15:56:36.413 に答える