没有收到socket tcp中的所有数据

时间:2017-01-11 12:44:29

标签: c# .net sockets

我正在使用socket C#。我使用套接字实现了客户端服务器应用程序,但问题是客户端没有收到服务器发送的所有数据。

这是客户端应用程序代码。我应该怎么做才能收到服务器发送的所有数据?

strRecieved = "";
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001);
soc.Connect(endPoint);
byte[] msgBuffer = Encoding.Default.GetBytes(msgToberecieved);
soc.Send(msgBuffer, 0, msgBuffer.Length, 0);
byte[] buffer = new byte[2000];
int rec = soc.Receive(buffer);

strRecieved = String.Format(Encoding.Default.GetString(buffer));

1 个答案:

答案 0 :(得分:0)

TCP是流协议,而不是数据报协议。这意味着可以通过多个接收呼叫分割数据。在一次接收呼叫中也可以接收多个分组。

因此,您需要一个应该定义数据长度的数据包帧。

例如:

创建一个带有signatue(uint)和datalength(uint)的头文件(总共8个字节)。跟进数据。 (x字节)

  • 首先保持接收数据,直到您有标题的大小。 (8字节)
  • 如果您仍然与数据包保持一致,请检查签名。 (在你的情况下采取一个神奇的数字)
  • 如果不超过接收缓冲区的上限,请检查长度的值。
  • 在收到所有数据之前一直接收数据。
  • 处理数据。
  • 重复。

要解析数据,您可以使用BitConverterBinaryReader

另一种可能性是读取数据,直到你有一个停止'标志。例如EOLEOF