2012-01-09 9 views
2

私はSslStream関数から読み取ろうとしていますが、私は接続タイムアウトを設定していないが、私はタイムアウトの例外を持っている場合、Read()は決して終了しません。この男は同じ問題がありますhttp://msdn.microsoft.com/en-us/library/system.net.security.sslstream.read.aspx。私はここでコードを行うべきではありませんSslStreamすべてのバイトを読み取る

public byte[] ReadBytes() 
    { 
     this.bufferGlobal.Clear(); 
     byte[] buffer = new byte[this.bufferSize]; 
     int recv = this.stream.Read(buffer, 0, buffer.Length); 
     while (recv != 0) 
     { 
      addBytes(buffer, ref bufferGlobal, recv); 
      recv = this.stream.Read(buffer, 0, buffer.Length);     
     } 
     return (byte[])this.bufferGlobal.ToArray(typeof(byte)); 
    } 

Thxを事前に入力してください。

UPD:

私は答えを見つけることだと思います。私はSslStreamと同等の読み込みタイムアウトを設定することができます。その値はソケットが有効ではありません(つまり、大きなファイルをダウンロードでき、SslStreamを気にせずに接続を閉じたり、データを受け取ることができます)。私はこのソリューションをテストしていますが、うまくいくようです。皆さん。

答えて

2

あなたは他の側は、接続のその半分を閉じるまであなたは、ストリームの終わりに遭遇しません意味ネットワークストリームから読んでいます。データの送信を停止するだけでは不十分です。したがって、あなたが意図しているすべてのデータを送信した後で、他のプログラムを接続を閉じるようにしてください。

+0

私はライブラリを書きますGoogleサービスとの通信と私はすべてのデータを送信した後にGoogleクローズ接続を尋ねることはできません。私が別のサイトに接続しようとすると、 "Good of Corporation"以外のすべての製品は正常に動作します))))別の方法がありますか? – gingray

2

ストリームは、接続が閉じられるまで終了しません。これは、未知の長さのすべてのストリームの性質です。

事前に長さを知っているか、接続が終了するまで読書を続ける必要があります。一般的な方法は、ストリームのバイト長を64ビット整数として送信することです。したがって、ストリームの最初の8バイトはint64に読み込まれ、残りはデータになります。

通常、ストリームでは一度に1つの「バッファ」が読み込まれます。

擬似コード

ながら(!Stream.end) {I = Stream.Read(バッファ、buffer.length) DestStream.Write(バッファ、I) }

+0

多分あなたは他の方法を知っていますか? – gingray

+0

私はGoogleのプロトコルがどのように機能するのか分かりませんが、ウェブプロトコルだと思います。この問題を解決するには多くの方法がありますが、他の人のプロトコルを使用している場合は、互換性のある方法で行う必要があります。 – Bengie

+0

それはhttpを介して動作します – gingray

関連する問題