2012-03-29 96 views
1

我連接到我想通過套接字查詢的設備。我可以發送命令沒有問題,但是當我嘗試獲取數據時,它會將它發回給我,這樣我就不會馬上收到整條消息。我採用了多次嘗試抓取的順序來嘗試連續獲取不同的部分,但我最後只用了最後一個部分。我認爲有一個時間問題,但不確定,而且,當代碼完成時,文本框不顯示任何文本,我認爲他們至少應該顯示接收到的內容的一部分。任何建議將不勝感激如何用C#中的TCP Client讀取整個輸入緩衝區?

  Byte[] Backdata = new byte[64]; //also tried 32, 16, 64   
      MoxaClient = new TcpClient(); 

      MoxaClient.Connect(NportAddress, NportPort); 
      datastream = MoxaClient.GetStream(); 
      datastream.Write(SCPIcommands, 0, SCPIcommands.Length); 

      //Function to wait for all responses   
      try 
      { 
       datastream.Read(Backdata, 0, Backdata.Length); 
       textBox1.Text += Convert.ToChar(Backdata.ToString()); 
      } 
      catch 
      {} 
      try 
      { 
       datastream.Read(Backdata, 4, Backdata.Length); 
       textBox1.Text += Convert.ToChar(Backdata.ToString()); 
      } 
      catch{} 

回答

1

TCP是面向流。你不能依靠「立即獲取整個信息」,也不能依靠任何可預測的尺寸。你必須建立一個協議或使用一個庫,它可以讓你識別你的應用程序特定消息的開始和結束。您應該讀取返回到緩衝區的數據,並以消息長度爲消息加上前綴,或者使用開始/結束消息分隔符來確定何時處理讀取緩衝區中的數據。

搜索TCP成幀,找到一些如何做到這一點的很好的例子。在StackOverflow中有幾個很好的代碼示例,包括answers to this question中的代碼示例(儘管它處理異步套接字)。

Sending Messages in a TCP Stream也有一些關於如何處理這個問題的很好的解釋。