DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Readメソッドで受信時の「ReceiveBufferSize」の値は何を制御しているのでしょうか?

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET / .NET Framework : 1.1]
分類:[.NET]

【解決したい問題】

Readメソッドで受信時の「ReceiveBufferSize」の値が何を制御しているのか、について質問させてください。

以下のように、Readメソッドでソケットの受信処理を行っているとします。(送信データサイズは任意とします)


Dim tcp As System.Net.Sockets.TcpClient = listener.AcceptTcpClient()

Dim ns As System.Net.Sockets.NetworkStream = tcp.GetStream()

Dim resBytes(40000) As Byte
Dim resSize As Integer
resSize = ns.Read(resBytes, 0, resBytes.Length)


受信用の変数を40001byteとしています。
この時、「tcp.ReceiveBufferSize」の値はデフォルトの「8192byte」です。
この状態でReadを実行すると、40001byte受信する事ができました。

■疑問点
「ReceiveBufferSize」の値は、Readメソッドの取得対象となるネットワークの受信用バッファのサイズ、と思っています。
つまり、「8192byte」の「バケツ」が用意されていて、Readの実行毎にそこから取得を行うものと考えていました。
にも関わらず、実際には「40001byte」受信できており、この「バケツ」の大きさを遥かに超えています。

上記のような動作をしたのですが、この「ReceiveBufferSize」の値は何を制御しているのでしょうか?


【解決するために何をしたか】

※参照サイト:TcpClient.ReceiveBufferSize プロパティ(Microsoft)
http://msdn.microsoft.com/ja-jp/library/system.net.sockets.tcpclient.receivebuffersize(VS.71).aspx

通常、ソケット受信でReadを行う場合、Read部分をループさせて全データ取得する事になると思います。

実験として、10MB程度のデータをループで受信させた場合には、「17000byte」〜「40001byte」程度の範囲でデータ受信が確認できました。

試しに「ReceiveBufferSize」を「1」や「9990000」に設定してみたのですが、目に見えた変化はありませんでした。

動作を見る限り、設定自体が無意味?なように見えます。
もしかすると、OS自体が別で制御している?という可能性もあるように見えます。
回答になるのかどうか分かりませんが、
ReceiveBufferSizeプロパティの使いかたとしては、

Dim resBytes(tcp.ReceiveBufferSize - 1) As Byte

という書き方の為にあるのではないかなと思いました。
この書き方でなら、ReceiveBufferSizeを「1」や「9990000」にしたときに、
それぞれ違いが分かると思いますし。

ただ、
「ReceiveBufferSizeを直接変更して受信サイズが変わらないのでは、
別にこのプロパティいらなくない?もしくはReadOnlyで十分じゃ?」
と言われれると、確かにNetworkStream.Readで受信サイズ指定しちゃうし、いらないのかな?
と思ったりしちゃいます。
でも、実際にプロパティが存在する以上、なにか理由があると思うんですけどね。
返信ありがとうございます。

> Dim resBytes(tcp.ReceiveBufferSize - 1) As Byte
>

確かに、この使い方なら納得。
ReceiveBufferSizeの意味は謎ですが。。
.NET Frameworkのバージョンによる違いもあるんですかね。

DOBON.NET | プログラミング道 | プログラミング掲示板