C# clientStream.Read返回错误的字节数
此代码适用于:C# clientStream.Read返回错误的字节数,c#,networking,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(me
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上处理消息,你需要在上面实现你自己的打包算法。实现这一目标的典型策略有:
如果要以阻塞方式读取所有数据,可以使用循环直到
DataAvailable
为true
,但随后调用read
返回0
。(希望我没记错,有一段时间没有做任何网络编程)您需要循环读取消息中的字节,直到TCP客户端上的属性或NetworkStream的属性为0(=不再剩下字节)来自MSDN:
读取操作读取尽可能多的可用数据,直到
大小参数指定的字节数
也就是说,在收到所有数据之前,必须在循环中调用Read()方法。请查看。阅读:
此方法将数据读入缓冲区参数并返回
成功读取的字节数。如果没有可供选择的数据
读取时,Read方法返回0。读取操作读取的数据量相同
可用的数据,最多为大小指定的字节数
参数如果远程主机关闭连接,以及
收到可用数据后,读取方法完成
立即返回并返回零字节
因此,可能是由于连接故障,每次都会得到不同的号码,无论如何,您可以检查结果,以了解原因。我认为这里已经给出的答案对您的具体问题做出了很好的回答,但可能更一般地说:如果您试图通过networkStream对象发送数据用于网络通信,请查看开源库。当您说“不工作”时,这是什么意思?每次它返回一个新的字节数时,数据可能不是立即发送的,而是分为多个数据包。这些11043是第一个数据包的大小。因此,您可能必须围绕
读取
创建一个循环。字节数是错误的,它没有读取整个数据块。所有这些变量的类型是什么?您是如何创建实例的?请显示更多代码。获取所有数据的示例:@duedl0r 1)您发布了一个指向自动翻译的德语版MSDN的链接。2) 你确定这个例子读到了最后吗?我认为它只读取所有可用的数据,如果部分数据还没有到达,它就会结束。1)嗯,我对此感到抱歉。2) 是的,它只读取可用数据。你不能期望更多,你必须实现你描述的打包算法。我只是想你可以用链接来补充你的答案。DataAvailable
是一个bool,因此不能是0。如果我回忆正确,正确的读取模式是检查DataAvailable==true
但是read
之后返回0
。@CodeInChaos true,DataAvailable是bool。不过,我一直在TCP客户端上使用Available属性,没有任何问题(到目前为止!)。