最初の4バイトでメッセージの長さインジケーターを指定するアプリケーションプロトコルを使用しています。Socket.Receiveは、その時点でプロトコルスタックにあるのと同じ量のデータを返すか、データが利用可能になるまでブロックします。これが、長さインジケーターでバイト数を受け取るまで、ソケットから継続的に読み取る必要がある理由です。反対側が接続を閉じた場合、Socket.Receiveは0を返します。私はそれをすべて理解しています。
読み取る必要のある最小バイト数はありますか?私が尋ねる理由は、ドキュメントから、socket.Receiveが戻ることができるときに全長インジケーター(4バイト)が使用できない可能性があるためです。その後、私たちは挑戦し続けなければならないでしょう。バッファの内外に物事をコピーする必要があるため、socket.receiveを呼び出す回数を最小限に抑える方が効率的です。したがって、長さインジケーターを取得するために一度に1バイトを取得する方が安全ですか、4バイトが常に使用可能であると想定するのが安全ですか、それともオフセット変数を使用して4バイトを取得しようとし続ける必要がありますか?
ある種のデフォルトの最小レベルがあるかもしれないと思う理由は、ソケットオプションで設定できるReceiveLowWater変数と呼ばれる変数に出くわしたためです。しかし、これはBSDにのみ当てはまるようです。MSDNSO_RCVLOWATを参照してください。
それはそれほど重要ではありませんが、私はユニットテストを書こうとしています。私はすでに標準の.Netソケットをインターフェースの後ろにラップしています。