c# - clientStream.Read 返回错误的字节数

标签 c# networking

此代码有效:

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

bytesRead = clientStream.Read(message, 0, 909699);

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

bytesRead = clientStream.Read(message, 0, 5242880);

为什么?我该如何解决?

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

最佳答案

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

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

如果你想在 TCP 上处理消息,你需要在它之上实现你自己的打包算法。实现这一目标的典型策略是:

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

如果您想以阻塞方式读取所有数据,您可以使用循环直到 DataAvailabletrue 但随后调用 Read 返回0。 (希望我没有记错那部分,好久没做过网络编程了)

关于c# - clientStream.Read 返回错误的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575659/

相关文章:

c# - 编译器对 switch 语句的看法是什么?

c - 在unix中检测蜂窝网络连接类型(2G/EDGE/3G/HSPA/HSPDA/LTE)

sockets - 为什么 skb_buffer 需要跳过 20 个字节才能在数据包输入时读取传输缓冲区?

c# - 如何对集合中所有对象的属性执行 .Max() 并返回具有最大值的对象

c# - 从嵌入式浏览器通过 javascript 调用应用程序的功能?

ios - WKWebView 的 HTTP 代理支持

Android TrafficStats getTotalRxBytes() 总是返回零

windows - 模拟网络到特定进程

c# - 在 Sitecore 中无法访问 WebMethod

c# - 如何在 Xamarin.Forms 中创建底部工作表