我使用.NET框架中的简单Socket类通过TCP发送和接收数据消息。当我在Windows XP上运行我的tcp客户端应用程序时,数据消息不会碎片化(拆分)。但是当我在Windows 7上运行相同的tcp客户端应用程序时,当数据邮件大小超过1074字节时,数据邮件会被分段(拆分)。
IPEndPoint ipEndPoint = new IPEndPoint("<server ip address>", 601);
Socket tcpSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tcpSocket.Connect(ipEndPoint.Address, ipEndPoint.Port);
tcpSocket .Send(data, data.Length, 0);
tcpSocket.Close();
如果您有任何建议,请与我们联系。
答案 0 :(得分:3)
TCP连接是一个字节流,它不知道您的消息边界。
来自TCP连接的任何单个读取都可以(并且将)在1个字节和提供的缓冲区大小之间返回。这可能会因网络状况而改变。
通过对Send()的特定调用写入TCP连接的数据量与通过调用Recv()从连接读取的数据量之间没有关系,除了写入的所有数据将通过一系列的Recv电话返回。
您应始终循环接收数据并使用自己的消息框架来确定消息边界。
我在这里写了更多关于此的内容:http://www.codeproject.com/KB/IP/testingsocketservers.aspx早在2002年。