当你不知道长度时,如何使用ReadAsync方法获得从sslsteam收到的字节长度?

时间:2016-03-04 10:01:07

标签: c# stream async-await byte sslstream

我使用下面的Async方法从服务器获取响应。我从服务器获得的响应根据请求类型从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。有了这个我得到缓冲区的原始大小,但Async await看起来更干净。所以,我想检查是否可以使用ReadAsync来获取长度。

1 个答案:

答案 0 :(得分:3)

例外说清楚:

  

此流不支持搜索操作。

首先,我无法理解为什么你不能使用更大的缓冲区:

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

相关问题