9

根据@Len-Holgate在这个问题中的建议,我异步请求 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 等。我不想逐字节地异步读取!

4

1 回答 1

1

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

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

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

于 2014-09-30T11:34:19.543 回答