SslStream相当于TcpClient.Available?

时间:2011-07-13 22:15:27

标签: c# asynchronous tcpclient sslstream

基于@Len-Holgate in this question的建议,我异步请求0字节读取,并且在回调中,接受具有同步读取的可用字节的字节,因为我知道数据可用且不会阻止。这看起来非常有效和精彩。

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

这有一个简单的伎俩吗?


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

sslStream.BeginRead(this.zeroByteBuffer, 0, 0, DataAvailable, this);

在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(...); 
}

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

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的邮件会被某个字符分隔,并且您已经使用StringBuilder来涵盖邮件分成多个部分时的情况。

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

这也包括同时收到两条消息的情况。