Чтение содержимого из SslStream - PullRequest
0 голосов
/ 12 октября 2011

У меня есть приложение, с помощью которого я выполняю команды IMAP, используя:

  • TcpClient для подключения к серверу IMAP
  • SslStream для записи и чтения команд

Проблема:

  • Невозможно прочитать полное содержимое вывода из потока
  • while цикл в SslStream.Read, похоже, не работает
  • StreamReader.ReadLine, ReadToEnd, Read методы не работают

Пример кода:

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 Ответ

3 голосов
/ 12 октября 2011

Поток TCP не может знать, закончился ли текущий ответ.Все, что он знает, это только что получил данные по проводам;он не может знать, придет ли следующий пакет прямо сейчас (многопакетный ответ) или придет ли он намного позже (если ответ закончен).

Вместо этого вам нужно предсказать, когда вы 'получу больше данных;вы должны продолжать чтение до тех пор, пока не получите помеченный ответ о завершении, как описано в протоколе IMAP.

Однако IMAP, по-видимому, предназначен для непрерывного чтения в фоновом потоке, поскольку сервер может отправлять вам информацию в любое время.время.Поэтому у вас, вероятно, должен быть отдельный поток, который всегда находится в ReadLine().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...