2011-06-16 53 views
4

剛剛在客戶端開始的問題。這裏是我的代碼,我收到TCP/IP消息。在我的本地PC上,這個聽衆收到很多K沒問題。我試圖增加緩衝區的大小,但在客戶的網站,他們仍然報告與之相關的問題..不過得到的只有前1K(1024個字節)TCP偵聽器在1024字節處切割郵件

public void Start() 
{ 
    //Define TCP listener 
    tcpListener = new TcpListener(IPAddress.Any, IDLocal.LocalSession.PortNumber); 

    try 
    { 
    //Starting TCP listenere 
    tcpListener.Start(); 

    while (true) 
    { 
     var clientSocket = tcpListener.AcceptSocket(); 
     if (clientSocket.Connected) 
     { 
     var netStream = new NetworkStream(clientSocket); 

     // Check to see if this NetworkStream is readable. 
     if (netStream.CanRead) 
     { 
      var myReadBuffer = new byte[1024]; 
      var myCompleteMessage = new StringBuilder(); 

      // Incoming message may be larger than the buffer size. 
      do 
      { 
      var numberOfBytesRead = netStream.Read(myReadBuffer, 0, myReadBuffer.Length); 
      myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); 
      } while (netStream.DataAvailable); 

      //All we do is response with "OK" message 
      var sendBytes = Encoding.ASCII.GetBytes("OK"); 
      netStream.Write(sendBytes, 0, sendBytes.Length); 

      clientSocket.Close(); 
      netStream.Dispose(); 

      // Raise event with message we received 
      DataReceived(myCompleteMessage.ToString()); 
     } 
     } 
    } 
    } 
    catch (Exception e) 
    { 
    //If we catch network related exception - send event up 
    IDListenerException(e.Message); 
    } 
} 
+0

它不一定是在1024處偵聽器,但可能是數據包大小。如果發送的數據大於1024,它是否在執行多個「編碼」消息? – BugFinder 2011-06-16 15:40:16

回答

7

我沒有看到任何代碼問題,你發佈到提取消息轉換爲字符串,所以我猜測還有其他的東西在進行着。

TCP不需要送你排隊給它的所有數據,一氣呵成。這意味着它可以一次發送儘可能少的數據,並且可以選擇將數據隨意分割。特別是,保證如果他們不適合一個數據包拆分您的數據。通常,最大數據包大小(aka MTU)是1532字節的IIRC。

因此有一個真正的可能性,即數據被髮送,但作爲一個以上的數據包。接收第一個和第二個數據包之間的延遲可能意味着當第一個數據包到達時,您的代碼愉快地讀取它包含的所有內容,然後在第二個數據包有時間到達之前停止(不再有數據)。

您可以通過檢驗這一假設,無論是觀測網絡流量,或者讓你的應用從線拉條短信,看看它最終不會得到所有你(在片雖然)發送的數據。

最終,根本的問題是TCP的基本流爲基礎的(而不是基於消息的)性質;即使你得到這個代碼正常工作,也不能保證它將在未來繼續工作,因爲它對TCP不保證的東西做出假設。爲了安全起見,您需要合併一個基於消息的結構(例如,將每一段數據準確地保留4個字節並保持其長度;然後,您可以繼續閱讀,直到您收到了很多字節爲止) 。

+1

非常感謝您的詳細回覆。消息是XML數據包。所以,我把這些都歸於非常短的字符串。現在所有數據包都是600字節,希望現在能解決問題,但我會牢記這一點 – katit 2011-06-16 15:51:07