【问题标题】:How to get length of bytes received from sslsteam using ReadAsync method when you don't know the length?当您不知道长度时,如何使用 ReadAsync 方法获取从 sslsteam 接收的字节长度?
【发布时间】:2016-06-18 00:15:58
【问题描述】:

我正在使用下面的异步方法从服务器获取响应。我从服务器得到的响应根据请求类型从 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 获取长度。

【问题讨论】:

    标签: c# stream async-await byte sslstream


    【解决方案1】:

    异常说清楚:

    此流不支持查找操作。

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

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

    【讨论】:

    • 请注意,仅调用一次ReadAsync() 可能不够:即使整个流更大,一次调用也只能部分填充缓冲区。
    • 感谢 svick,现在我将我的代码包装在一个 while 循环中 byte[] response = new byte[1500];整数读;整数偏移量 = 0; while ((numRead = await _sslStream.ReadAsync(response, offset, response.Length)) != 0) { offset += numRead;但是得到一个异常说“偏移量和计数之和不能大于缓冲区的长度”。在第二次迭代中。你能告诉我在部分缓冲区填充场景中实现这个的正确方法是什么。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2013-05-23
    • 1970-01-01
    • 2016-11-30
    • 2015-04-27
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多