2012-02-27 169 views
1

我想在C#中接收一個tcp數據包,但我不知道什麼時候可以停止從流中讀取數據。 這是我已經試過:如何知道流已經結束C#

for(int i = 0; i < stm.Length; i += chunkSize) 
{ 
    bb = new byte[chunkSize]; 
    k = stm.Read(bb, 0, bb.Length); 
    ns.Write(bb, 0, k); 
} 

但它扔我一個錯誤關於該流爲不可搜索。 所以我試過這個:

int k = chunkSize; 

while (k == chunkSize) 
{ 
    bb = new byte[chunkSize]; 
    k = stm.Read(bb, 0, bb.Length); 
    ns.Write(bb, 0, k); 
} 

有什麼關係嗎? 謝謝:)

+0

爲什麼你不是Google的「如何從C#中的TCP流讀取」?必須有1000多種解釋。 – usr 2012-02-27 17:58:02

+0

我相信設置k等於chunkSize可能會有問題。看看stream.Read()返回的是什麼。它並不總是等於你所期望的。 – Jason 2012-02-27 17:59:55

回答

4

這裏,我們去:

int read; 
while((read = stm.Read(bb, 0, bb.Length)) > 0) { 
    // process "read"-many bytes from bb 
    ns.Write(bb, 0, read); 
} 

「讀」將僅在流的末尾,不積極在流的末尾,和。

或者更簡單(4.0):

stm.CopyTo(ns); 
+0

問題是,如果沒有東西可讀,代碼就會在Read方法上凍結。我猜這是超時或什麼的,但是我不認爲這是正確的解決方案,要等到每個數據包結束時超時爲止 – 2012-02-27 18:02:13

+0

@ JohnSmith然後,您需要使用Select()之類的內容來確定是否有數據可供讀取。 – itsme86 2012-02-27 18:03:37

+0

@約翰是的,你剛剛完美地描述了閱讀的行爲。如果你不想這樣做,你必須使用其中一個異步API,並且有時在發送套接字 – 2012-02-27 18:04:19

1

一個二進制讀取是你需要什麼,因爲它知道到底有多少字節讀取!

它前綴字節的長度,所以它知道多少讀!

+0

一個二進制閱讀器只能在幾個非常特定的場景中做到這一點,如果該協議是在其他地方定義的,那麼它就毫無用處。坦率地說,我做了很多通信/協議/序列化/等代碼,並且我完全不會使用BinaryReader。 – 2012-02-27 18:06:53

+0

哈哈哈....我知道我錯了... thxx爲你的信息.. ,但它不是有助於閱讀字符串.. – Anirudha 2012-02-27 18:10:02

+0

我沒有說「錯」 - 只是...過度熱心或許。對於字符串:同樣,這是否有用取決於有線協議如何存儲它們。例如,這個星期我一直在寫WebSocket製作器;有(基本上)2個WebSocket協議和兩個處理字符串 - 這對他們中的任何一個都沒有幫助。它也不會幫助在redis協議或protobuf協議等字符串... – 2012-02-27 18:12:39

相關問題