6

ソケットを介して送信される 100 バイトを考慮してください。TCP ソケットでrecv()は、長さ 50 で呼び出すと最初の 50 バイトが取得され、再度呼び出すと 2 番目の 50 バイトが取得されます。UDP ソケットでrecvfrom()は、長さ 50 で呼び出した場合、最初の 50 バイトを取得しますが、2 番目の 50 バイトを取得する方法がありませんrecvfrom()。次のデータグラムが受信されるまで、後続の呼び出しはブロックされます。

これは、UDP データグラム全体を受信したい場合、サイズに関係なく、64k のバッファー (UDP で許可されている最大値) を割り当てなければならないということですか? connect()UDP ソケットの場合、動作は変わりますか? それとも、UDP を介して動作するプロトコルは、通常、バッファに使用する必要がある既知の最大パケット サイズを伴いますか?

4

1 に答える 1

2

ほとんどの健全な UDP ベースのプロトコルは、 IP フラグメンテーションを回避するために、 MTUの少ない IP および UDP ヘッダーを経由しません。たとえば、DNS は 512 バイトより大きいメッセージの場合は TCP に切り替えます。したがって、ネットワークがジャンボ フレームを使用しない限り、1472 バイト (1500 イーサネット MTU - オプションなしの IP ヘッダーの場合は 20 - 8 UDP ヘッダー) のバッファーでおそらく安全です。もちろん、これは UDP 上のアプリケーション プロトコルに依存します。

あなたが本当に偏執的である (または不明なプロトコルで作業している) 場合は、最初にMSG_PEEKMSG_TRUNCフラグを使用してサイズを把握し、次に十分な大きさのバッファーを割り当てることができます (「 」を参照recv(2))。

于 2012-09-13T17:34:39.947 に答える