从SslStream中读取内容

时间:2011-10-12 16:55:02

标签: c# ssl imap

我有一个应用程序,使用它来执行IMAP命令:

  • TcpClient连接到IMAP服务器
  • SslStream编写和阅读命令

问题:

  • 无法从流中读取完整的输出内容
  • while循环SslStream.Read似乎无法正常工作
  • StreamReader.ReadLineReadToEndRead方法不起作用

示例代码:

while ((l = reader.ReadLine()) != null)
{
    output.AppendLine(l);
}

此代码段会读取1到2行并挂起reader.Readline()

解决方法我尝试设置ReadTimeout属性:

try
{
    _output=new byte[_tcpclient.ReceiveBufferSize];
    _sslstream.Read(_output, 0, _output.Length);
    textBox1.Text = Encoding.ASCII.GetString(_output);
}
catch (IOException ex)
{
    textBox1.Text ="ERROR !! " + ex.Message;                
}

帮助:

  • 如何从流中读取命令的完整输出?

注意:我不想使用任何第三方库。

1 个答案:

答案 0 :(得分:3)

TCP流无法知道当前响应是否已完成。它只知道它是否刚刚在线上接收数据;它无法知道下一个数据包是否会立即出现(多数据包响应),或者它是否会更晚出现(如果响应完成)。

相反,您需要预测何时会获得更多数据;您应该继续阅读,直到收到标记的完成响应,如IMAP协议中所述。

但是,IMAP似乎打算在后台线程上连续读取,因为服务器可以随时向您发送信息。因此,您可能应该有一个始终位于ReadLine()的单独线程。