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



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

有没有办法从SslStream.ReadAsync获得接收的原始字节的长度?

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

我尝试使用以下代码,但收到异常说:

此流不支持查找操作。

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

早些时候,我使用了BeginRead/EndRead .有了它,我得到了缓冲区的原始大小,但异步等待看起来更干净。所以,我想检查是否可以使用 ReadAsync 获得长度。

异常清楚地

说:

此流不支持查找操作。

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

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

如果流具有缓冲区可以容纳的数据较少,则只会加载部分缓冲区。也许你不知道,但你可以得到读取字节的值:

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 字节)。

相关内容

  • 没有找到相关文章

最新更新