【问题标题】:Not recieving all data in socket tcp未接收套接字 tcp 中的所有数据
【发布时间】:2023-04-07 19:06:01
【问题描述】:

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

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

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));

【问题讨论】:

标签: c# .net sockets


【解决方案1】:

TCP 是流协议,而不是数据报协议。这意味着可以将数据拆分为多个接收调用。也有可能在一个接收调用中接收到多个数据包。

所以你需要一个数据包帧来定义数据的长度。

例如:

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

  • 首先继续接收数据,直到达到标头大小。 (8 个字节)
  • 如果您仍然与数据包对齐,请检查签名。 (在你的情况下取一个幻数)
  • 检查长度值是否不超过接收缓冲区的上限。
  • 继续接收数据,直到您收到所有数据。
  • 处理数据。
  • 重复。

对于解析数据,您可以使用BitConverterBinaryReader


另一种可能性是读取数据,直到出现“停止”标志。例如EOLEOF 等。

【讨论】:

  • 请是 C# 的新手,请您帮忙更新我的代码,谢谢
猜你喜欢
  • 2012-12-28
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2016-05-26
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多