SslStream相当于TcpClient.Available?

Jas*_*ban 9 c# asynchronous tcpclient sslstream

根据@ Len-Holgate 在这个问题中的建议,我异步请求0字节读取,并且在回调中,接受字节可用字节和同步读取,因为我知道数据是可用的并且不会阻塞.这看起来非常有效和精彩.

但后来我为SslStream添加了选项,并且方法崩溃了.零字节读取很好,但是SslStream解密字节,在TcpClient的缓冲区中保留零字节计数(恰当如此),我无法确定SslStream中现在有多少字节可用于读取.

有一个简单的伎俩吗?


一些代码,仅用于上下文:

sslStream.BeginRead(this.zeroByteBuffer, 0, 0, DataAvailable, this);
Run Code Online (Sandbox Code Playgroud)

在EndRead()(正确返回0)之后,DataAvailable包含:

// by now this is 0, because sslStream has already consumed the bytes
available = myTcpClient.Available; 

if (0 < available) // Never occurs
{
    // this part can be distractingly complicated, but 
    // it's based on the available byte count
    sslStream.Read(...); 
}
Run Code Online (Sandbox Code Playgroud)

由于协议,我需要逐字节评估和解码可变字节宽度的unicode和东西.我不想异步读取逐字节!

C.E*_*uis 1

如果我理解正确,您的消息是由某个字符分隔的,并且您已经在使用 aStringBuilder来覆盖消息分成多个部分时的情况。

您可以考虑在读取数据时忽略分隔符,在数据可用时向其中添加任何数据,然后检查本地StringBuilder的分隔符。sb.ToString(0, delimiterIndex)找到后,您可以使用和提取单个消息,sb.Remove(0, delimiterIndex)直到没有分隔符为止。

这也涵盖了同时接收两条消息的情况。