C#Networkstream BeginRead如何获取缓冲区长度/大小

本文关键字:缓冲区 大小 获取 BeginRead 何获取 C#Networkstream | 更新日期: 2023-09-27 18:28:35

我在获取应用程序的正确缓冲区大小时遇到问题。我从网站上读到的关于指定缓冲区大小的内容通常是在阅读之前声明的。

byte[] buffer = new byte[2000];

然后使用来获得结果。然而,一旦收到的数据包含"00",这个方法就会停止,但我的返回代码包含这样的内容。。。5300000002000000EF0000000A00。并且长度不是固定的,可以这么短,直到400字节

所以问题来了,如果我像上面那样定义一个前缀长度,例如2000,那么返回值是5300000002000000ef000000000000000000000000000000000000000000000000000000000000000000。。。。。。。。。。从而使我无法将字节分割到正确的数量。

any1能告诉我如何从网络流或任何方法/欺骗中获得实际接收的数据大小吗?

提前谢谢。

C#Networkstream BeginRead如何获取缓冲区长度/大小

网络流没有长度。

不幸的是,你的问题太过详细,所以很难提供具体的建议。但你有几个选择:

  • 如果这里使用的高级协议提供了一种知道将要发送的数据长度的方法,请使用它。这可以很简单,就像远程主机在其余数据之前发送字节计数一样,或者可以向远程主机发送一些命令来查询数据的长度。如果不知道您使用的是什么高级协议,就无法判断这是否是一种选择。

  • 将传入的数据写入MemoryStream对象。无论高级协议是否提供了一种提前知道预期数据量的方法,这都会一直有效。请注意,如果没有,那么您只需要接收数据,直到网络流结束。

后一种选择看起来像这样:

MemoryStream outputStream = new MemoryStream();
int readByteCount;
byte[] rgb = new byte[1024]; // can be any size
while ((readByteCount = inputStream.Read(rgb, 0, rgb.Length)) > 0)
{
    outputStream.Write(rgb, 0, readByteCount);
}
return outputStream.ToArray();

这假设您有一个名为"inputStream"的网络流。

我之所以展示上述内容,主要是因为它展示了从网络流中分段读取,然后将结果存储在其他地方的更普遍的做法。此外,它很容易适应直接从套接字实例读取(您没有提到您实际用于网络I/O的内容)。

然而,如果您实际使用Stream对象进行网络I/O,那么从.NET 4.0开始,有一种更方便的方法可以编写上面的内容:

MemoryStream outputStream = new MemoryStream();
inputStream.CopyTo(outputStream);
return outputStream.ToArray();