我正在处理一个执行大量异步读取的应用程序。为了提高性能,我想直接从 SslStream
同步调用 Read
,前提是调用不会阻塞。
SslStream
本身并不像底层 NetworkStream
那样提供 DataAvailable
属性。
因此,鉴于我知道它是一个正在读取的包装网络流,DataAvailable
中的 true
是否保证对 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
是否需要从底层流中读取一个以上的字节才能读取一个加密字节。
最佳答案
不,它不能保证,因为在下一层有 SSL 记录,您可能还没有收到完整的记录,从密码学上讲,在您拥有所有记录之前您不能做任何事情,因为您首先必须检查 MAc 的完整性。
但更重要的是,我质疑整个策略。只需在正常代码中根据需要发出读取:不要试图猜测哪种模式在每种情况下效果最好。 SSL 开销可能会淹没同步/异步差异,而网络带宽限制会淹没它们。
关于c# - 我可以依赖 DataAvailable 来获取 SSL 封装的网络流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954739/