繁体   English   中英

SslStream 等效于 TcpClient.Available?

[英]SslStream equivalent of TcpClient.Available?

根据@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 等。 我不想逐字节地异步读取!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM