clientStream.Read返回错误的字节数

arm*_*min 2 c# networking

此代码有效:

TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[5242880];
int bytesRead;

bytesRead = clientStream.Read(message, 0, 909699);
Run Code Online (Sandbox Code Playgroud)

但是这会返回错误的字节数:

bytesRead = clientStream.Read(message, 0, 5242880);
Run Code Online (Sandbox Code Playgroud)

为什么?我该如何解决?

(实际数据大小为1475186;代码返回11043作为字节数)

Cod*_*aos 7

如果这是一个基于TCP的流,那么答案是其余的数据还没有到达.

TCP是面向流的.这意味着Send/ Write调用次数和接收事件数量之间没有关系.可以将多个写入组合在一起,并且可以拆分单个写入.

如果要使用TCP上的消息,则需要在其上实现自己的打包算法.实现这一目标的典型策略是:

  1. 每个前缀按其长度打包,通常使用二进制数据
  2. 使用分隔序列,例如换行符.通常与文本数据.

如果你想在你可以使用循环,直至阻塞的方式读取所有数据DataAvailabletrue但后续调用Read返回0.(希望我能正确地记住那部分,暂时还没有做任何网络编程)