2014-04-08 118 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

相关问题