Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从StreamSocket读取时,DataReader结果被截断_C#_Sockets_Windows 8_Microsoft Metro_Imap - Fatal编程技术网

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

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

我有以下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看起来像某种极限。我该怎么做

,正如我在博客上解释的那样。因此,在部分消息或任意数量的消息之后返回部分
LoadAsync
是完全正常的

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


无论如何,您所看到的是完全正常的,对于TCP/IP通信来说是可以接受的。您必须在
LoadAsync
(和
ReadString
)上循环,直到检测到消息的结尾。我认为IMAP使用linefeed,至少在一些消息delimeters中是这样。通常情况下,你必须处理你的消息会在字符串中间结束的情况,但是我想也许可以跳过这个IMAP的检查。

谢谢,史蒂芬,我想我需要在Load Asthyc上循环,但是在什么条件下?代码>而什么?直到您收到完整的消息。IMAP协议应该定义什么是“完整消息”-我不确定该协议。IMAP以*OK开头的行响应,以指定“完整消息”的结尾。在WinRT之前,我可以使用ReadLine()返回一行并测试它。但是,现在我只能读取一定长度的字符串。所有示例都建议使用
reader.UnsumedBufferLength
,但这比我正在阅读的消息要短,如果我尝试循环读取的代码,它就会挂起。您只需继续循环,直到看到以*OK开头的行。没有内置的
readlinesync
。我曾多次尝试在响应上循环,结果得到了无限循环。最后我试着一次一个,逐渐增加。事实证明,当*应该是命令numeber时,我确实在检查
*OK
。谢谢你的耐心。