clientStream.Read返回错误的字节数

时间:2011-12-20 12:45:43

标签: 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作为字节数)

5 个答案:

答案 0 :(得分:7)

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

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

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

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

  3. 如果您想以阻止方式阅读所有数据,可以使用循环直到DataAvailabletrue,但随后对Read的调用将返回0。 (希望我能正确地记住那部分,暂时没有做任何网络编程)

答案 1 :(得分:2)

来自MSDN:

  

Read操作读取尽可能多的数据,直到   size参数指定的字节数。

即。你必须在循环中调用Read()方法,直到收到所有数据。看看sample code in MSDN

答案 2 :(得分:1)

您需要循环读取消息中的字节,直到TCP客户端上的Available属性或NetworkStream的DataAvailable属性为0(=不再剩下字节数)

答案 3 :(得分:1)

阅读Documentation

  

此方法将数据读入缓冲区参数并返回   成功读取的字节数。如果没有可用的数据   读取时,Read方法返回0. Read操作读取的内容也是如此   数据可用,最大为大小指定的字节数   参数。如果远程主机关闭连接,则全部关闭   已收到可用数据,Read方法完成   立即返回零字节。

所以可能是因为连接失败,你每次都得到不同的数字,无论如何你可以检查结果,知道它的原因。

答案 4 :(得分:0)

我认为这里的答案很好地回应了您的具体问题,但可能更为一般:如果您尝试通过networkStream对象发送数据以进行网络通信,请查看开源库,{{3} }。