none
NetworkStreamの最大情報量 RRS feed

  • 質問

  • TCP接続で非同期受信する場合、普通はお互いにNetworkStreamを作成しBeginReadしますが
    これを片方がBeginReadせず、もう一方がパケットを送り続けた場合、
    パケットがたまってくるせいなのか送信側の処理がストップしそこでプログラムが止まってしまいます。

    パケット量は最大何byteまでためておけるものなのでしょうか?
    調べてみましたが、私の調べ方が悪いのか情報が見つかりませんでした。
    ご存じの方教えて頂けますと幸いです。
    2009年7月12日 15:38

回答

  • TCPにはフロー制御があるので、TCPウィンドウが一杯になってもACKを返さなければ送信側は止まります。
    その意味での最大バイト数はTCPウィンドウサイズになります。

    その上のソケットレイヤーでのバッファサイズでしたらSocket.ReceiveBufferSizeになります。
    (これにウィンドウサイズを合わせたバイト数になるのかな?)
    受信側TcpClientのReceiveBuffSizeを変更してみればどれだけためられるか調べられると思いますよ。

    ReceiveBuffSizeの最大値はSO_MAX_MSG_SIZEでSetSocketOptionとGetSocketOptionつかって調べられるのかな?
    • 回答としてマーク 無限極限 2009年7月14日 0:58
    2009年7月13日 10:32

すべての返信

  • TCPにはフロー制御があるので、TCPウィンドウが一杯になってもACKを返さなければ送信側は止まります。
    その意味での最大バイト数はTCPウィンドウサイズになります。

    その上のソケットレイヤーでのバッファサイズでしたらSocket.ReceiveBufferSizeになります。
    (これにウィンドウサイズを合わせたバイト数になるのかな?)
    受信側TcpClientのReceiveBuffSizeを変更してみればどれだけためられるか調べられると思いますよ。

    ReceiveBuffSizeの最大値はSO_MAX_MSG_SIZEでSetSocketOptionとGetSocketOptionつかって調べられるのかな?
    • 回答としてマーク 無限極限 2009年7月14日 0:58
    2009年7月13日 10:32
  • 本筋じゃなくなるのかもしれませんが、なぜそれを知りたいのかが気になりました。
    その得られる数値によって決め打ちでコードを書くという場面は想像しにくいことと、そういった上限ギリギリの使い方は他に問題を生む可能性を懸念しました。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年7月13日 13:45
    モデレータ
  • gekkaさん返信ありがとうございます。
    そういうことでしたか。参考になりました。
    2009年7月14日 0:57
  • Azuleanさんご忠告ありがとうございます。
    2009年7月14日 0:58