2017-08-13 76 views
1

使用TCP客戶端時,NetworkStream.read方法通常不會返回完全填充的緩衝區。我怎樣才能讓它阻止進一步的執行,直到寫完整個數組?通過Tcp客戶端讀取大數據包

byte[] datagramByteForm = new byte[dgramSizeInt]; 
int j = dataIOStream.Read(datagramByteForm, 0, datagramByteForm.Length);//read the actual datagram 
if (j != datagramByteForm.Length) 
{ 
    throw new Exception("Connection j value: " + j + " expected amount: " + datagramByteForm.Length); 
} 
+0

也許'BytesAvailable'小於dgramSizeInt。 – aghilpro

+0

我通常使用'TcpClient',可以設置'tcpClient.Client.ReceiveBufferSize = 20000;' – aghilpro

+0

緩衝區大小不是這裏的問題 – user3488765

回答

1

它其實很簡單,你只需要在stream.read函數中使用提供的參數。 這裏是一個例子(未經測試):

 TcpClient TCC = new TcpClient("127.0.0.1", 200); 
     int cOffset = 0, dgramSizeInt = 5000, j; 
     byte[] datagramByteForm = new byte[dgramSizeInt]; 

     var dataIOStream = TCC.GetStream(); 

     while (cOffset <= dgramSizeInt) 
     { 
      j = dataIOStream.Read(datagramByteForm, cOffset, dgramSizeInt-cOffset); 
      cOffset += j; 
     } 
+0

我想通了,你說得對。 (int needReRead = datagramByteForm.Length; int readAmount = 0; int currentRead = 0; while((needToRead = needToRead - currentRead)!= 0){ // needToRead = needToRead - readAmount; currentRead = dataIOStream.Read(datagramByteForm,readAmount,needToRead); //讀取的實際數據報 readAmount + = currentRead; }) – user3488765

+0

(您的解決方案不重新調整在流中的讀數長度.read) – user3488765

+0

是的,對不起我的錯,但正如我所說我只是寫下來而沒有編譯它:P(編輯) – AllCowsAreBurgers