4509


SslStreamでサーバーサイドの実装をしています。  
読み取るデータがない状態でRead()を呼ぶと、ブロッキングされてしまいます。  
戻り値に0が返ってくると思っていましたが、返ってきません。  
これ以上読むべきデータがない状態を判断することはできますか？

同じSslStreamを使用してクライアントの実装をしたら0が返ってくるので判断できました。  
サーバーサイドの実装だけがブロッキングしてしまっているので困っています。

NetWorkStreamではDataAvailableというプロパティがあるのでデータがそれ以上ない状態を判断できますが、SslStreamの場合のやり方がわかりません。

[code]

        public static byte[] Read(SslStream stream)
        {
            MemoryStream ms = new MemoryStream();
            byte[] resBytes = new byte[1024];
            try
            {
                while (true)
                {
                    int n = stream.Read(resBytes, 0, resBytes.Length);
                    if (0 < n)
                    {
                        ms.Write(resBytes, 0, n);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
    
            return ms.ToArray();
        }
    
[/code]


CC BY-SA 3.0
2015-01-12T13:53:10.680
4444
2015-01-13T13:57:47.720
3496
question
c# .net
.NETのSslStreamでデータの終端を判断したい


MSDNの[クラス情報](http://msdn.microsoft.com/ja-
jp/library/system.net.security.sslstream\(v=vs.110\).aspx)を見た感じだと、これ以上読むべきデータが無いかを確認する方法はなさそうですね。  
以下のような感じでタイムアウト(以下の例は0.1秒)を設定して、ずっと待ち続けないようにするのではダメですか？

[code]

    sslStream.ReadTimeout = 100;
    
[/code]


CC BY-SA 3.0
2015-01-12T14:23:09.830
4447
2015-01-12T14:23:09.830
33
4444
answer


「これ以上読むべきデータがない状態」とは何かにより答えが変わりますが、「送信側で送ったすべてのデータを、受信側で読み終わった状態」を指すのであれば、Stream関係のクラスにそのような機能はありません。(コードやコメントを見た感じからそう仮定して以下書いています。違っていたらごめんなさい)

SSLなので下層のプロトコルはTCPですが、TCPはストリーム指向でメッセージ境界の概念がないので、ユーザーがコード上でデータ区切りを指定しないといけません。Microsoftのサンプル  
<http://msdn.microsoft.com/ja-
jp/library/system.net.security.sslstream(v=vs.110).aspx>  
では、`if (messageData.ToString().IndexOf("<EOF>") !=
-1)`と、アプリで勝手に終端マークを決めて通信しています。このように終端を決めるか、TCPヘッダやHTMLのContent-
Lengthのように序盤に長さを送るか、他にも方法はありますが、基本はそんな感じです。

正常な処理ルートでタイムアウトによる強制中断をすると、ただ回線が混んでいてパケットの到着が遅れているだけの場合でも、問答無用で切断してしまいます。


CC BY-SA 3.0
2015-01-13T13:57:47.720
4509
2015-01-13T13:57:47.720
799
4444
answer