我正在处理一个执行大量异步读取的应用程序。为了提高性能,我希望直接从Read
对SslStream
进行同步调用,前提是该调用不会阻止。
SslStream
本身不提供基础DataAvailable
所属的NetworkStream
属性。
所以,鉴于我知道它是一个正在读取的包装网络流,true
中的DataAvailable
是否会保证对SslStream
的调用不会导致阻塞?< / p>
像这样:
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
是否需要从基础流中读取多个字节以便读取一个加密字节。
答案 0 :(得分:2)
不,不能保证,因为下一层有SSL记录,你可能还没有收到整个SSL记录,而且从密码学的角度来说,除非你拥有所有内容,否则你无法做任何事情。首先必须检查MAc是否完整。
但更重要的是,我质疑整个战略。只需在正常代码中按需要发出读取:不要试图猜测在每种情况下哪种模式最有效。 SSL开销可能会淹没同步/异步差异,并且网络带宽限制将使它们都淹没。
答案 1 :(得分:1)
它取决于使用中的密码 - 使用RC4或其他流密码的端点更可能一次解密一个字节,但不能保证。为DES或其他块密码配置的端点将等待,直到完整块可用。
你可以使用可窥探的中间缓冲流做一些棘手的事情,并尝试确保在进行阻塞读取之前你有一个合理的块大小,但这是令人讨厌的。
如果你绝对无法阻止,我会坚持使用BeginRead和一个完成委托。