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

时间:2014-10-30 10:00:38

标签: c# networkstream

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

byte[] buffer = new byte[2000];

然后用来得到结果。 但是,一旦收到的数据包含“00”,此方法就会停止,但我的返回代码包含类似的内容... 5300000002000000EF0000000A00。并且长度不固定,可以短至400字节

所以问题来了,如果我定义一个像上面这样的前缀长度,例如2000,则返回值为 5300000002000000EF0000000A000000000000000000000000000000000000000000000000000 .......... 因此使我无法将字节分割为正确的数量。

any1能告诉我如何从网络流或任何方法/作弊获取实际收到的数据大小以获得我需要的东西吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

网络流没有长度。

不幸的是,你的问题很清楚细节,因此很难提供具体的建议。但是你有几个选择:

  • 如果此处使用的高级协议提供了一种了解将要发送的数据长度的方法,请使用它。这可以像远程主机在其余数据之前发送字节计数一样简单,也可以发送一些命令发送到远程主机以查询数据长度。如果不知道您使用的是哪种高级协议,就不可能说这是否是一种选择。

  • 将传入的数据写入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)。

但是,如果您实际上正在为您的网络I / O使用Stream对象,那么从.NET 4.0开始,有一种更方便的方式来编写上述内容:

MemoryStream outputStream = new MemoryStream();

inputStream.CopyTo(outputStream);

return outputStream.ToArray();