C# 从StreamSocket读取时,DataReader结果被截断
我有以下c#/WinRT代码来接收来自IMAP命令的响应C# 从StreamSocket读取时,DataReader结果被截断,c#,sockets,windows-8,microsoft-metro,imap,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){ d
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看起来像某种极限。我该怎么做 ,正如我在博客上解释的那样。因此,在部分消息或任意数量的消息之后返回部分LoadAsync
是完全正常的
8192听起来像是一个巨型帧(千兆以太网)。或者可能是某个.NET层的默认读取大小
无论如何,您所看到的是完全正常的,对于TCP/IP通信来说是可以接受的。您必须在
LoadAsync
(和ReadString
)上循环,直到检测到消息的结尾。我认为IMAP使用linefeed,至少在一些消息delimeters中是这样。通常情况下,你必须处理你的消息会在字符串中间结束的情况,但是我想也许可以跳过这个IMAP的检查。谢谢,史蒂芬,我想我需要在Load Asthyc上循环,但是在什么条件下?代码>而什么?直到您收到完整的消息。IMAP协议应该定义什么是“完整消息”-我不确定该协议。IMAP以*OK开头的行响应,以指定“完整消息”的结尾。在WinRT之前,我可以使用ReadLine()返回一行并测试它。但是,现在我只能读取一定长度的字符串。所有示例都建议使用reader.UnsumedBufferLength
,但这比我正在阅读的消息要短,如果我尝试循环读取的代码,它就会挂起。您只需继续循环,直到看到以*OK开头的行。没有内置的readlinesync
。我曾多次尝试在响应上循环,结果得到了无限循环。最后我试着一次一个,逐渐增加。事实证明,当*应该是命令numeber时,我确实在检查*OK
。谢谢你的耐心。