2

recvしたがって、TCP ストリームの場合、各呼び出しでメッセージがどれだけ読み取られたかを追跡する必要があります。その後、部分的な読み取りをつなぎ合わせて、最終的にメッセージを正常に受信できます。

しかし、UDP メッセージの場合、部分的な読み取りをどのように処理する必要がありますか (すべての UDP メッセージが断片化を回避するのに十分小さいと仮定すると)? 部分的なメッセージの残りのデータは破棄されているようですが、recvfrom送信されたバッファーと同じサイズを返すようにするだけですか? 違いがある場合は、それが部分的で欠陥のあるメッセージであることを意味し、スキップする必要があります。

したがって、概念的には、TCP の例ではループが必要ですが、UDP の例では if ステートメントだけが必要です。

これは正しいです?

4

4 に答える 4

1

正しくない。recv() が指定された長さと同じ長さを返す場合、メッセージはその長さ以上でした。どちらであるかを知る方法はありません。正しい方法は、予想される最大の可能なデータグラムよりも 1 大きいバッファを使用することです。その長さを取得した場合は、送信者側のエラーである必要があります。

于 2013-10-21T00:03:19.427 に答える