在WinRT / C#中通过StreamSocket连接到IMAP

3

我试着编写一段简单的代码,使用StreamSocket连接到IMAP服务器。它可以读取服务器连接响应,但之后就无法读取任何其他数据。

    private async void TCPTest(string hostName, string port)
    {
        status.Text = "start of TCPTest";

        StreamSocket socket = new StreamSocket();
        await socket.ConnectAsync(new HostName(hostName), port);

        string senddata = "A001 login uuu ppp";

        status.Text += "\n first reading...";
        DataReader reader = new DataReader(socket.InputStream);
        reader.InputStreamOptions = InputStreamOptions.Partial;
        await reader.LoadAsync(1024);
        string data = reader.ReadString(reader.UnconsumedBufferLength);
        status.Text += "\n > read " + data;

        status.Text += "\n writing...";
        writer = new DataWriter(socket.OutputStream);
        writer.WriteString(senddata);
        await writer.StoreAsync();
        status.Text += "\n > wrote " + sendata;

        status.Text += "\n second reading...";
        writer = new DataWriter(socket.OutputStream);
        await reader.LoadAsync(1024);
        string data2 = reader.ReadString(reader.UnconsumedBufferLength);
        status.Text += "\n >" + data2;

        status.Text += "\n end of TCPTest";
    }

这是我的输出结果。

start of TCPTest
first reading...
> read * OK mydomain.com IMAP4rev1 MDaemon 13.0.1 ready
writing...
> wrote A001 login uuu ppp
second reading... 

这个应用程序一直停留在这里,没有错误提示,也没有继续执行。我在做什么方面犯了基本错误吗?我的代码与MSDN上的StreamSocket示例基本相同。


在编写代码时,确保读取操作已经完成,否则可能会造成套接字挂起或看起来没有执行任何操作,但不会出现错误。 - Jordy van Eijk
我该怎么做?类似于 while (reader.UnconsumedBufferLength > 0) 这样的东西? - roryok
忘记终止命令了。哎呀。 - roryok
1个回答

3
原来我没有终止我的命令。在结尾添加Environment.Newline解决了问题。

你能解释一下发生了什么吗?你是不是忘记在查询的末尾添加"\r\n"或简单地说"CRLF"了? - imslavko
我没有在查询结尾添加\r\n,所以它是未终止的。我本可以通过添加\r\n来修复它,但我在C#中使用了Environment.Newline属性,这与添加\r\n相同。虽然我发现语法更容易阅读。 - roryok
太棒了!我也遇到了同样的问题。这篇文章帮了我很多! - c0D3l0g1c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接