基于@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和东西。我不想异步读取字节!
答案 0 :(得分:1)
如果我理解正确,您的邮件会被某个字符分隔,并且您已经使用StringBuilder
来涵盖邮件分成多个部分时的情况。
您可以考虑在读取数据时忽略分隔符,在可用时向其添加任何数据,然后检查本地StringBuilder
的分隔符字符。找到后,您可以使用sb.ToString(0, delimiterIndex)
和sb.Remove(0, delimiterIndex)
提取单个邮件,直到找不到分隔符。
这也包括同时收到两条消息的情况。