2

我有以下 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 看起来像是某种极限。我该如何解决这个问题?

4

1 回答 1

2

正如我在博客中解释的那样,TCP/IP 套接字的抽象是字节流,而不是消息流。因此,LoadAsync在部分消息或任意数量的消息之后有部分返回是完全正常的。

8192 听起来可能是一个巨型帧(千兆以太网)。或者可能是某些 .NET 层的默认读取大小。

无论如何,您所看到的对于 TCP/IP 通信来说是完全正常且可以接受的。您必须循环LoadAsync(and ReadString) 直到您检测到消息的结尾。我认为 IMAP 使用换行符,至少对于它的一些消息分隔符。通常,您必须处理消息以字符串中间结尾的情况,但我认为也许可以跳过对 IMAP 的检查。

于 2012-10-11T15:02:29.203 回答