2011-06-16 27 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