c# - 获取 NetworkStream 中可用数据的长度

标签 c# .net sockets tcp networkstream

我希望能够从 C# 中的 TCP 网络流中获取可用数据的长度,以便在从网络流读取之前设置缓冲区的大小。有一个 NetworkStream.Length 属性,但尚未实现,我不想为缓冲区分配一个巨大的大小,因为它会占用太多空间。我想这样做的唯一方法是在数据传输之前用另一个告诉大小,但这似乎有点困惑。对我来说,执行此操作的最佳方式是什么。

最佳答案

访问时Streams ,您通常以小块(例如 1 千字节左右)的形式读取和写入数据,或者使用类似 CopyTo 的方法。那就是为你做的。

这是一个示例,使用 CopyTo 将一个流的内容复制到另一个流,并使用自动调整大小的方法将其作为 byte[] 返回缓冲区。

using (MemoryStream ms = new MemoryStream())
{
    networkStream.CopyTo(ms);
    return ms.ToArray();
}

这段代码以相同的方式读取数据,但更多的是手动读取,这可能更适合您使用,具体取决于您对数据的处理方式:

byte[] buffer = new byte[2048]; // read in chunks of 2KB
int bytesRead;
while((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0)
{
    //do something with data in buffer, up to the size indicated by bytesRead
}

(这些代码片段的基础来自 Most efficient way of reading data from a stream )

关于c# - 获取 NetworkStream 中可用数据的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19387979/

相关文章:

javascript - 客户端socket.id刷新?

c# - 通过鼠标单击获取网格单元

c# - 值类型相等和强命名程序集

c# - 数字处理线程的高效取消事件实现?

c# - 最终输出中的额外零是从哪里来的?

c# - HttpWebResponse 的编码问题

c# - 我如何以编程方式知道代码在哪个平台下运行?

c# - 使用 LiNQ 加载嵌套的 XML

sockets - 服务器可以在单个线程中处理多个套接字吗?

c++ - eof 错误读取文本文件片段并写入 boost.asio 套接字