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

C# C Networkstream入门如何获取缓冲区长度/大小?,c#,networkstream,C#,Networkstream,我在获取应用程序的正确缓冲区大小时遇到问题。 我从网站上读到的关于指定缓冲区大小的内容通常在阅读之前声明 byte[] buffer = new byte[2000]; 然后用它来得到结果。 但是,一旦接收到的数据包含“00”,此方法将停止,但我的返回代码包含如下内容。。。530000000200000EF0000000A00。长度不是固定的,可以短到400字节 所以问题来了,如果我像上面那样定义一个前缀长度,例如2000,返回值是 53000000020000EF0000000A000000

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

byte[] buffer = new byte[2000];
然后用它来得到结果。 但是,一旦接收到的数据包含“00”,此方法将停止,但我的返回代码包含如下内容。。。530000000200000EF0000000A00。长度不是固定的,可以短到400字节

所以问题来了,如果我像上面那样定义一个前缀长度,例如2000,返回值是 53000000020000EF0000000A000000000000000000000000000000000000000000000。。。。。。。。。。 因此,我无法将字节拆分为正确的数量

any1能否向我展示如何从networkstream或任何方法/欺骗中获取实际接收的数据大小,以获得我需要的数据


提前感谢。

网络流没有长度

不幸的是,你的问题很简单,所以很难给出具体的建议。但你有几个选择:

如果此处使用的高级协议提供了一种了解将发送的数据长度的方法,请使用该方法。这可能很简单,比如远程主机在其余数据之前发送字节计数,或者您可以向远程主机发送一些命令来查询数据的长度。如果不知道您使用的是哪种高级协议,就无法确定这是否是一种选择

将传入数据写入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();

让我们看看你有什么。基本上我在这里什么也看不出来,因为我被卡住了,根本无法继续。我写的唯一与本主题相关的东西是tcpstream.beginreadbuffer,0,inttcpsocket.ReceiveBufferSize,new asynchcallbackreceivecallback,tcpstream;我被ReceiveCallBack方法卡住了,因为Z完全无法处理传入的dataNetworkStream继承流,所以Stream.Length将包含流的长度(如果已知)。这是尝试过的。它返回seek不受支持。非常感谢您的解释和回答。它在我的程序中为我工作。需要增加休息时间;在while循环中,否则它将是无限的。由于与其他硬件兼容,我的程序运行在.net framework 3.5中,因此无法测试更简单的代码。无限循环很奇怪。您使用什么条件来控制break语句的执行?在更高的层次上整合这些信息可能更好,这取决于它是什么。我在编写代码时使用这些代码,尤其是用于获取传入数据数量的部分。既然你放了while…>0,如果inputStream.Read包含数据,它将>0,因此它将永远卡在while循环中。因此,增加休息时间;将在获取数据后退出while循环。抱歉,您没有意义。如果您在代码中添加了break语句,那么您并没有像您[I]编写的那样使用代码。对>0的测试是该代码的一个关键元素,因为您希望循环在读取数据后继续。请重新阅读我的回答,特别是我指出我提出的两个广泛建议中的一个或另一个,但不是两个都合适的部分。