+-

我使用TcpClient BeginConnect创建到TCP服务器的套接字连接.这将返回一个IAsyncResult,其中CompletedSynchronously为false,这是我至少在大多数时候所期望的.我将套接字NetworkStream包装在SslStream调用BeginAuthenticateAsClient中,它返回一个IAsyncResult,其中CompletedSynchronously为true.这真让我感到惊讶,因为这种方法可以多次往服务器进行握手.每个BeginWrite& BeginRead我从那时开始返回一个IAsyncResult,其中CompletedSynchronously为true.
我怀疑SslStream的实现不支持异步IO.我打算通过在没有SSL包装器的情况下访问服务器来确认这一点,但不幸的是,服务器需要SSL,所以我不能.
如果SslStream不支持异步,我计划将SslStream包装在内存流中,然后将其传递给NetworkStream BeginRead / BeginWrite.不幸的是,我无法进行握手异步.
有人知道SslStream实际上是否不支持异步IO吗?是否有解决方法来实现它?
谢谢.
担
最佳答案
我使用 Reflector打破了SslStream,我可以确认,至少,BeginAuthenticateAsClient,BeginWrite和BeginRead都是完全同步完成的,正如您所观察到的那样.但是,回调方法被推送到ThreadPool,以便异步进入,但实际的读取或写入在BeginWrite或BeginRead返回之前已经完成.
关于这一点的奇怪之处在于,似乎SslStream在异步模式下获取所有内容,但在返回之前等待读取或写入完成.为什么这样做?我不知道!
似乎没有任何方法可以改变SslStream的这种特殊行为.
点击查看更多相关文章
转载注明原文:c# – SslStream异步方法总是返回一个IAsyncResult,其中CompletedSynchronously为True.为什么? - 乐贴网