我有以下 C#/WinRT 代码来接收来自 IMAP 命令的响应
DataReader reader = new DataReader(sock.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
await reader.LoadAsync(1000000);
string data = string.Empty;
while(reader.UnconsumedBufferLength > 0){
data += reader.ReadString(reader.UnconsumedBufferLength);
}
结果在 8192 字节后被截断。 8192 看起来很可疑,像是某种限制。我该如何解决这个问题?
最佳答案
The abstraction of TCP/IP sockets is a stream of bytes, not a stream of messages ,正如我在博客中解释的那样。因此,在部分消息或任意数量的消息之后返回部分 LoadAsync
是完全正常的。
8192 听起来可能是一个巨型帧(千兆位以太网)。或者可能是某些 .NET 层的默认读取大小。
无论如何,您所看到的情况对于 TCP/IP 通信来说是完全正常且可接受的。您必须循环 LoadAsync
(和 ReadString
),直到检测到消息结束。我认为 IMAP 使用换行符,至少对于其消息定界符的一些是这样。通常,您必须处理消息以字符串中间结束的情况,但我认为也许可以跳过 IMAP 的此检查。
关于c# - 从 StreamSocket 读取时 DataReader 结果被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838747/