Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# clientStream.Read返回错误的字节数_C#_Networking - Fatal编程技术网

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属性,没有任何问题(到目前为止!)。