2012-01-09 102 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的讀取超時設置爲1,這對於活動套接字來說沒有意義(它意味着您可以下載大文件,不必擔心SslStream不會關閉連接或中斷接收數據)。我只是測試這個解決方案,但似乎工作正常。 Thx大家。

回答

2

您正在從網絡流中讀取數據,也就是說您不會遇到流結束,直到對方關閉它的一半連接。僅僅停止發送數據是不夠的。因此,讓其他程序在發送了所有要發送的數據後關閉連接。

+0

我寫庫與谷歌服務溝通,我不能要求谷歌關閉連接後傳輸所有數據。正如我看到當我試圖連接到不同的網站一切正常,除了「公司的好」)))也許我們有另一種方式來做到這一點? – gingray 2012-01-09 17:33:38

2

直到連接關閉,流纔會結束。這是所有未知長度的流的性質。

您或者需要提前知道長度,或者需要繼續閱讀直到連接關閉。一種常見的方式是將數據流的字節長度傳輸爲64位整數。所以你的流的前8個字節被讀入一個int64,然後剩下的就是數據。

通常一次讀入一個流「緩衝區」。

僞代碼

而(!Stream.end) { I = Stream.Read(緩衝液,buffer.length) DestStream.Write(緩衝液,ⅰ) }

+0

也許你知道其他方式? – gingray 2012-01-09 17:41:01

+0

我不確定Google的協議是如何工作的,但我會認爲這是一個網絡協議。有很多方法可以解決這個問題,但是如果您使用其他人的協議,則需要以兼容的方式進行操作。 – Bengie 2012-01-09 17:55:15

+0

它對http – gingray 2012-01-09 18:42:06