2

我正在处理一个执行大量异步读取的应用程序。为了提高性能,我想直接对Readfrom 进行同步调用,SslStream前提是调用不会阻塞。

SslStream本身并不DataAvailable像底层NetworkStream那样提供属性。

那么,鉴于我知道它是一个正在读取的包装网络流,是否会true保证DataAvailable对 的调用SslStream不会导致阻塞?

像这样:

public void Read(NetworkStream netStream, SslStream sslStream)
{
    // given that netStream is the inner stream of sslStream
    if (netStream.DataAvailable)
    {
        // Will not block
        sslStream.Read(...);
    }
    else
    {
        // Would block
        sslStream.Read(...);
    }
}

SslStream已经过身份验证并准备就绪。我不确定除了加密/解密之外是否还有其他开销。我认为答案取决于是否SslStream需要从底层流中读取超过一个字节才能读取一个加密字节。

4

2 回答 2

2

不,它不能保证,因为在下一层有 SSL 记录,你可能还没有收到完整的记录,从密码学上讲,在你拥有一切之前你不能做任何事情,因为你首先必须检查 MAC 的完整性。

但更重要的是,我质疑整个策略。只需在正常代码中根据需要发出读取:不要试图猜测哪种模式在每种情况下最有效。SSL 开销可能会淹没同步/异步差异,并且网络带宽限制会淹没它们。

于 2012-08-14T23:06:55.003 回答
1

这取决于使用中的密码——使用 RC4 或其他流密码的端点更有可能一次解密一个字节,但不能保证。为 DES 或其他块密码配置的端点将等待,直到一个完整的块可用。

您可以使用可窥视的中间缓冲流来做一些棘手的事情,并尝试在进行阻塞读取之前确保您有一个合理的块大小,但这很讨厌。

如果你绝对不能阻止,我会坚持 BeginRead 和完成委托。

于 2012-08-14T16:52:21.107 回答