Readメソッドで受信時の「ReceiveBufferSize」の値は何を制御しているのでしょうか?
- 題名: Readメソッドで受信時の「ReceiveBufferSize」の値は何を制御しているのでしょうか?
- 著者: 麒麟
- 日時: 2009/12/08 17:48:23
- ID: 25990
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: Readメソッドで受信時の「ReceiveBufferSize」の値は何を制御しているのでしょうか?
- 著者: ainax
- 日時: 2009/12/09 18:14:56
- ID: 26005
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: Readメソッドで受信時の「ReceiveBufferSize」の値は何を制御しているのでしょうか?
- 著者: 麒麟
- 日時: 2009/12/10 13:57:11
- ID: 26007
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.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自体が別で制御している?という可能性もあるように見えます。