3

UDP (C) を使用して小さなアプリケーションを実装しています。サーバーは、指定されたファイルのデータを指定された量 (例: 100 バイト/呼び出し) のチャンクでクライアントに送信します。クライアントはファイルをダウンロードし、どこかに保存します。問題は、クライアントが読み取り/呼び出しするバイト数を示すパラメーターを受け取ることができることです。
私の問題は、サーバーが 100 バイト/呼び出しを送信し、クライアントが 15 バイト/呼び出しのみを読み取るように設定されている場合です。メッセージが UDP キューから削除されるため、残りの 85 バイトは失われます。

これらのメッセージが完全に読み取られるまでキューから削除せずに、これらのメッセージをチャンクで読み取る方法はありますか?

4

2 に答える 2

4

UDP は、TCP のようにチャンク読み取りを許可しません。UDP メッセージの読み取りは、全か無かの操作です。メッセージ全体を完全に読み取るか、まったく読み取らないかのいずれかです。その中間はありません。そのため、UDP ベースのプロトコルは、固定サイズのメッセージを使用するか、両当事者がメッセージ サイズを動的にネゴシエートする必要があります (たとえば、TrivialFTP が行うように)。

UDP プロトコルが各メッセージのバイト サイズを送信する必要がある理由はありません。メッセージのサイズ自体が、メッセージ内のデータのサイズを暗黙的に決定します。

メッセージを実際に読み取る前にメッセージのサイズを絶対に決定する必要がある場合はrecvfrom()MSG_PEEKフラグを使用して呼び出し、データをコピーするための大きなバッファーを与えることができます (少なくとも 64K。IPv6 を使用していない限り、UDP メッセージはこれを超えることはありません)。ジャンボグラムですが、それは別の問題です)。出力は、まだキューにあるメッセージの実際のサイズを示します。ただし、この方法を使用する場合は、MSG_PEEKフラグをドロップして常に 64K バッファーを使用して読み取ることもできます。これにより、バッファー サイズが不十分なためにデータがドロップされる可能性がなくなります。

于 2013-03-16T08:26:14.577 に答える
0

スレッドを作成して、UDP バッファからデータを無限に読み取り、データをサークルバッファに保存できます。クライアントがあなたの速度でデータを消費するよりも。サーバーの送信速度がクライアントの送信速度よりも速いため、バッファがオーバーフローすると何もできなくなります。

于 2013-03-16T08:27:17.867 に答える