2016-07-24 11 views
0

私はlibuvでサーバ​​ーをテストしています。libuvでさらにデータを待つ方法は?

問題は、データが部分的に届くことであり、データを待つ必要があるということです。 (このような状況が発生していないが、私はそれが角を回っていると思いますが、私の経験で)

しかし、これlibuvは、イベントベース、および次のafter_read(に依存している)機能 は、次のパケットを保証するものではありませんでしょう残っている。

どのように回避するのだろうか。 ありがとうございます。


追加されました。 スプリットされたパケットの私の懸念される状況。

  • クライアントA、クライアントB、サーバS

    1. Aはサーバーに100のバイトを送信すると仮定する。
    2. Bは100バイトをサーバーに送信します。
    3. SはAの最初の50バイトを受信します。 (リードコールバック中)
    4. SはBの100バイトを受信します。 (リードコールバック中)
    5. SはAの残り50バイトを受け取ります。 (読み取りコールバックで)

ステップ3の後、私が到着するの残りの部分Aの50bytesを期待するが、私の予想とは異なり、Bの100のバイトが到着しました。私の目標は、Aの全データに対してステップ3(50バイト)+ステップ5(50バイト)をマージすることです。

答えて

2

libuvではデータを待たずに、uv_read_startを呼び出してデータを読み込み、読み込むデータがあるときに読み込みコールバックを呼び出すように要求します。アプリケーションが完全なデータパケットを読み取る必要がある場合は、通常、ステートマシンを使用して現在の状態を把握し、完全なパケットを取得するまでバッファリングしたデータを保持します。

+0

ご意見ありがとうございます、saghul。私はuv_read_startとコールバック関数の基本的な機能について知っています。しかし、私は分割されたパケットが心配です。私は私の投稿についての説明を追加しました。すべてのパケットを管理する必要があるのですか、またはパケットの順序とフラグメントに対処する良い方法がありますか? –

+0

私はあなたがステートマシンといくつかのバッファリングなしでこれを処理できるとは思わない。接続ごとに1パケットをバッファし、処理が完了するまで処理しないでください。 UDPを使用している場合は、送信元アドレスとパケットバッファーの間のマッピングが必要なため、複雑になります。 libuvは非常にアプリケーション固有のものなので、ここであなたを助けるための組み込み機能はありません。 – saghul

+0

はい。私はアプリケーション固有のものだとも思っていますが、私は無知を恐れて尋ねました。私はこの時点で各クライアントごとに特定のサイズのバッファを割り当てることを検討しています。ご指摘ありがとうございます。 –

関連する問題