我有以下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看起来很像某种极限。我该如何解决这个问题?
答案 0 :(得分:2)
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检查。