从StreamSocket读取时,DataReader结果被截断

时间:2012-10-11 11:43:44

标签: c# sockets windows-8 microsoft-metro imap

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

1 个答案:

答案 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检查。