2014-10-30 188 views
0

我有一个问题,以获得我的应用程序的正确的缓冲区大小。 我从网站上读到的关于指定缓冲区大小的内容通常在阅读之前进行声明。C#Networkstream BeginRead如何获取缓冲区长度/大小?

byte[] buffer = new byte[2000]; 

然后用来得到结果。 但是,一旦收到的数据包含'00',此方法将停止,但是我的返回码包含类似这样的内容...... 5300000002000000EF0000000A00。和长度不是固定的,可以是该短直到400个字节

所以存在的问题来了,如果我定义如上,例如2000预先固定的长度,返回值是 5300000002000000EF0000000A000000000000000000000000000000000000000000000000000 ......... 因此使我无法将字节拆分为正确的数量。

任何一个可以告诉我如何从网络流或任何方法/作弊获得我需要的实际接收到的数据大小?

在此先感谢。

+0

让我们了解您有。 – fredrik 2014-10-30 10:03:36

+0

基本上什么都没有,我可以在这里显示,因为我卡住了,根本无法继续。我写的唯一和这个主题相关的是 'tcpstream.BeginRead(readbuffer,0,(int)tcpsocket。ReceiveBufferSize,新的AsyncCallback(ReceiveCallBack),tcpstream);' 我被卡在ReceiveCallBack方法中,因为完全无法处理传入的数据 – doppleganger 2014-10-30 10:06:37

+0

'NetworkStream'继承'Stream',所以'Stream.Length'将包含长度流如果知道。 – aevitas 2014-10-30 10:10:34

回答

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,那么作为.NET 4.0,出现了写上面更方便的方法:

MemoryStream outputStream = new MemoryStream(); 

inputStream.CopyTo(outputStream); 

return outputStream.ToArray(); 
+0

非常感谢您的解释和答案。它适用于我的程序。 ,并且需要在while循环中添加一个'break;',否则它将是无限的。 由于与其他硬件的兼容性,无法测试由于我的程序在.net framework 3.5中运行的更简单的代码。 – doppleganger 2014-10-31 06:14:51

+0

无限循环很奇怪。你用什么条件来控制'break'语句的执行?将这些信息纳入更高层次可能更好,这取决于它是什么。 – 2014-10-31 06:58:17

+0

我使用代码就像编写代码一样,尤其是获取传入数据的部分。因为你把'while(...> 0)',如果inputStream.Read包含数据,它将> 0,因此它将永久停留在while循环中。因此添加一个'break;'会在获取数据后退出while循环。 – doppleganger 2014-11-03 07:10:04