2014-04-08 117 views
0

這是我將數據發送到客戶端服務器端代碼:接收無效的數據通過TCP套接字

public bool SendMessage(Socket socket, byte[] message, string logMessage = "Unknow") 
    { 
     try 
     { 
      MsgTemp msg = new MsgTemp(socket, logMessage, message); 

      System.Diagnostics.Trace.WriteLine(" send ---------- " + message.Length.ToString()); 

      socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallBack), msg /* null*/); 
      return true; 
     } 
     catch 
     { 
      // :) removed 
     } 
     return false; 
    } 

這個代碼是接收客戶端回調方法:

private void ReceiverCallBack(IAsyncResult ar) 
    { 
     try 
     { 
      int size = _socket.EndReceive(ar); 
      _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiverCallBack), null); 

      System.Diagnostics.Trace.WriteLine(" received ---------- " + size.ToString()); 

      // messagereceived is an event 
      if (MessageReceived != null) 
      { 
       byte[] temp = new byte[size]; 
       Array.Copy(_buffer, temp, size); 

       MessageReceived(temp); 
      } 
     } 
     catch (Exception exp) 
     { 
      // :) removed 
     } 

    } 

當服務器發送多個包客戶端數據無效。 (在正常/低交易正確工作)

看到這個(字節被服務器之間發送的客戶端在會話中):

send ---------- 496 
received ---------- 496 
send ---------- 613 
received ---------- 613 
send ---------- 680 
received ---------- 680 
send ---------- 227 
send ---------- 697 
received ---------- 227 
send ---------- 722 
send ---------- 710 
received ---------- 697 
received ---------- 1432 

最後兩個包被髮送到在一個封裝接收到的客戶端 - > 722 + 710 = 1432 且數據無效/不可用...

爲什麼?謝謝

回答

1

這是TCP如何工作 - 這是一個協議。這些字節保證按照它們發送的順序準確接收,但可以一次執行多個Send操作的數據,或者在兩個Receive中接收一個Send操作的數據。

您必須以某種方式定義消息是什麼 - 通常首先發送消息的大小,然後是消息負載。

例如參見http://blog.stephencleary.com/2009/04/message-framing.html - 它包含了對原因,方式和代碼示例的很好解釋。網上還有很多其他的例子。

+0

你的解決方案是,首先發送消息的大小必須由客戶端接收然後發送數據/字節? – warrior

+0

@warrior我不喜歡提供粘貼就緒的解決方案,但是如果你問我,這是最好的方法。我發佈的博客鏈接包含一個示例鏈接:http://blog.stephencleary.com/2009/04/sample-code-length-prefix-message.html –

+0

謝謝,那篇文章非常好,他也有同樣的問題。 – warrior

相關問題