c# - 当您不知道长度时,如何使用 ReadAsync 方法获取从 sslsteam 接收的字节长度?

标签 c# stream async-await byte sslstream

我正在使用下面的异步方法从服务器获取响应。根据请求类型,我从服务器获得的响应从 1200 字节到 1500 字节不等。所以,我无法修复缓冲区的大小。

SslStream.ReadAsync 有什么方法可以获取接收到的原始字节的长度吗?

byte[] Buffer = new byte[1500];
await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);

我尝试使用下面的代码,但出现异常:

This stream don't support seek operations.

await _sslStream.ReadAsync(Buffer, 0, (int)_sslStream.Length);

早些时候,我使用了BeginRead/EndRead。这样我就得到了缓冲区的原始大小,但 Async await 看起来更干净了。因此,我想检查是否可以使用 ReadAsync 获取长度。

最佳答案

异常清楚地说:

This stream don't support seek operations.

首先,我不明白为什么你不能使用更大的缓冲区:

byte[] Buffer = new byte[1500];    
await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);

如果流中的数据少于缓冲区可以容纳的数据,则只会加载缓冲区的一部分。也许你不知道,但是你可以得到read bytes的值:

byte[] Buffer = new byte[1500];    
var bytesRead = await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);

然后您可以创建自己的缓冲区,正好适合读取数据的长度:

byte[] bufferThatFitsData = new byte[bytesRead];
Array.Copy(buffer, 0, bufferThatFitsData, 0, bytesRead);

现在,bufferThatFitsData 的长度等于流的大小(假设不超过 1500 字节)。

关于c# - 当您不知道长度时,如何使用 ReadAsync 方法获取从 sslsteam 接收的字节长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35793049/

相关文章:

c# - WPF 复选框与多行内容左上角对齐

c# - Xamarin.Forms HTTPS 和自签名证书问题

c# - 如何绝对捕获所有异常/错误

java - 给定的 URL 有 fileNotFoundException

Node.js readStream 用于大文件末尾

c# - 限制重复请求

c# - 访问属性的最佳方式

Java Streams TakeUntil 过滤/收集 100 个元素

python - 如何等待协程直到满足条件?

c# - 与 WinUI3 一起使用时,为什么 .NET 通用主机不停止?