3
int recvfrom(SOCKET            socket, 
             char            * buffer, 
             int               buflen, 
             int               flags, 
             struct sockaddr * from, 
             int             * fromlen);

ソケットからrecvfrom()読み取った直後に戻ることを知っています。buflenここでの私の質問は -

  1. 2000を要求buflenし、ソケット キュー内の 1 つのパケットのサイズが 2400 の場合はどうなりますか?

  2. 2000を要求buflenし、ソケット キュー内の 1 つのパケットのサイズが 1400 の場合はどうなりますか?

  3. 上記の質問に対する回答は、TCP と UDP の両方に同じですか? そうでない場合、違いは何ですか。

事前に返信を感謝します。

4

2 に答える 2

3

まず、読み取り待ちのものがすでにある場合、またはソケットが非ブロック モードの場合にのみ、すぐにrecvfrom()戻ります。それ以外の場合は、データの到着を待ちます。

次に、UDP はオール オア ナッシングです。ストリーミング データで動作する TCP とは異なり、UDP は代わりにデータグラムで動作し、データグラムを分割して読み取ることはできません。

だから、あなたの質問に答えるために:

  1. 2000 バイトがバッファーにコピーされ、残りの 400 バイトは破棄されて失われます。これは、バッファーが小さすぎて完全なデータグラムを受信できないためです。recvfrom()EMSGSIZE エラーが報告されます。

  2. バッファはデータグラム全体を受信するのに十分な大きさであるため、1400 バイトがバッファにコピーされます。recvfrom()成功を報告します。

  3. これらは TCP には当てはまりません。まず、通常はrecvfrom()TCP では使用せず、recv()代わりに使用します。ただし、いずれの場合も、TCP では、指定されたバイト数まで、必要に応じてブロックし、その時点で現在利用可能recv/from()なバイトをすべて受信しますが、それより少ない場合もあります。TCP はストリームベースであるため、呼び出しを続けて残りのバイトを受信できます。UDP はメッセージ ベースであるため、残りのバイトは受信できず、失われます。次は、次に利用可能なデータグラムを読み取ります。recv/from()recv/from()

于 2015-10-11T18:57:06.223 に答える