11

初心者向けの質問: 少し前に質問した質問のフォローアップのようなものです。

この同期ソケット チュートリアルhttp://msdn.microsoft.com/en-us/library/6y0e13d3.aspx、特に以下のコードの 1 行を理解しようとしています。

質問: プログラム フローを正しく理解していることを確認したいと思います。handler.Receive(bytes)はいつ返されますか? 「オーバーフロー」して 1024 バイト以上を受信した場合、受信したバイト数をint bytesRec** に返して格納しますか? **もしそうで、ばかげているように聞こえるかもしれませんが、 * data * 変数に 1024 バイトを格納していて、その時点で到着する可能性のあるそれ以上のバイトをリッスンしていないため、さらに多くのバイトが到着するとどうなりますか? それとも、心配せずに .net に任せるべきでしょうか?

Socket handler = listener.Accept();
data = null;

// An incoming connection needs to be processed.
while (true) {
    bytes = new byte[1024];
    int bytesRec = handler.Receive(bytes);
    // My question is WHEN does the following line
    // get to be executed
    data += Encoding.ASCII.GetString(bytes,0,bytesRec);
    if (data.IndexOf("<EOF>") > -1) {
        break;
    }
}
4

1 に答える 1

12

handler.Receive(bytes)はいつ返されますか?

ドキュメンテーション:

読み取りに使用できるデータがない場合、Socket.ReceiveTimeoutを使用してタイムアウト値が設定されていない限り、Receiveメソッドはデータが使用可能になるまでブロックします。タイムアウト値を超えた場合、Receive呼び出しはSocketExceptionをスローします。非ブロッキングモードで、プロトコルスタックバッファに使用可能なデータがない場合、Receiveメソッドはすぐに完了し、SocketExceptionをスローします。Availableプロパティを使用して、データを読み取ることができるかどうかを判断できます。Availableがゼロ以外の場合、受信操作を再試行してください。


「オーバーフロー」して1024バイトを超えて受信した場合、受信したバイト数をint bytesRecに返し、格納しますか?

いいえ、常に読み取られたバイト数を返します。そうでない場合、bytes意味のあるデータが含まれている部分と、未使用のままになっている部分をどのようにして知ることができますか?

ソケットが通常どのように機能するかを理解することは非常に重要です。バイトはパケットで到着する可能性がありますが、受信者に関する限り、各バイトは個別に考慮する必要があります。これは、送信者が送信したチャンクのバイトを取得する保証はなく、もちろん、バッファーをいっぱいにするのに十分なデータがあるという保証もありません。

Receive受信データを1024バイトのチャンクでのみ処理する場合は、合計1024バイトが解放されるまで呼び出しを続けるのはユーザーの責任です。

そうだとすれば、これはばかげているように聞こえるかもしれませんが、1024バイトを変数に格納し、その時点で到着する可能性のあるバイトをリッスンしていないため、さらにバイトが到着するとどうなりますか?

Receiveこれがバッファのサイズであるため、1024バイトがバッファに格納されないことを繰り返してみましょう。最大1024バイトを保存します。

ネットワークスタックによって内部的にバッファリングされたデータがバッファで保持できるよりも多い場合、1024バイトが返され、残りはReceive再度呼び出すまでネットワークスタックのバッファに残ります。がバッファへのデータのコピーを開始し、その時点でネットワークからより多くのデータが受信された場合、おそらく何が起こるかというと、これらは次の呼び出しReceiveを待たなければならないということです。Receive

結局のところ、可能な限りすべてReceiveのデータを提供する保証を提供した人は誰もいませんでした(もちろん、それは望ましいことであり、ほとんどの場合に発生します)。

于 2013-03-20T12:58:32.253 に答える