c# - 从 StreamSocket 读取时 DataReader 结果被截断

标签 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 看起来很可疑,像是某种限制。我该如何解决这个问题?

最佳答案

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/

相关文章:

C# 结构默认值

c - 内部套接字和外部套接字以及 TCP

c - 多连接多流

java - 如何使用 Java 检测 Windows 8 开始屏幕何时打开?

c# - Linq - 获取数组中的连续数字

c# - 如何使用 HttpWebRequest 将 XML 流发布到 wcf http rest 服务

c - TCP_KEEPIDLE 应该低于 TCP_KEEPINTVL 吗?

c# - 设置派生 ListBox 的 ItemsSource 抛出 "Catastrophic failure"

c# - Visual Studio 扩展 - 继承类图