Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2014, 19:17   #1
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию Проблема с чтением сообщения (POP3, SslStream, TCPClient)

Всем привет.
При обращении к серверу с командой RETR через функцию SslStream.Read запрошенное сообщение не записывается в буфер. Если быть более точным, то при вызове RETR в буфер всегда пишется размер сообщения, а вот само сообщение записывается далеко не всегда.

Код:
int bytes = -1;
            string message;
            TcpClient s = new TcpClient("pop.mail.ru", 995);
            SslStream sslStr = new SslStream(s.GetStream());
            sslStr.AuthenticateAsClient("pop.mail.ru");
            byte[] buffer = new byte[2048];
            bytes = sslStr.Read(buffer, 0, buffer.Length);
            message = Encoding.ASCII.GetString(buffer, 0, bytes);
            textBox5.Text += "Server: " + message;

            //Логинимся - тут все нормально
            sslStr.Write(Encoding.ASCII.GetBytes("USER kostoshir@mail.ru\r\n"));
            bytes = sslStr.Read(buffer, 0, buffer.Length);
            message = Encoding.ASCII.GetString(buffer, 0, bytes);
            textBox5.Text += "Server: " + message;
            
            //Пароль - тут тоже все работает
            sslStr.Write(Encoding.ASCII.GetBytes("PASS 1q\r\n"));
            bytes = sslStr.Read(buffer, 0, buffer.Length);
            message = Encoding.ASCII.GetString(buffer, 0, bytes);
            textBox5.Text += "Server: " + message;

            //Вот тут через раз возникает проблема
            sslStr.Write(Encoding.ASCII.GetBytes("RETR 1" + "\r\n"));
            bytes = sslStr.Read(buffer, 0, buffer.Length);                     //В массив buffer иногда не записывается запрошенное сообщение
            message = Encoding.ASCII.GetString(buffer, 0, bytes);
            textBox5.Text += "Server: " + message;
Результат выполнения одного и того же программного кода может быть таким:
Цитата:
Server: +OK
Server: +OK
Server: +OK Welcome!
Server: +OK 1721 octets
И вот таким:

Цитата:
Server: +OK
Server: +OK
Server: +OK Welcome!
Server: +OK 1721 octets
Return-path: <>
Authentication-Results: mxs.mail.ru; spf=permerror (mx145.mail.ru: error in processing during lookup of domain of sibmail.com: include: or redirect= caused unlimited recursion) smtp.helo=sibmail.com
Received-SPF: permerror (mx145.mail.ru: error in processing during lookup of domain of sibmail.com: include: or redirect= caused unlimited recursion) client-ip=77.106.108.92; envelope-from=postmaster@sibmail.com; helo=sibmail.com;
Received: from [77.106.108.92] (port=47071 helo=sibmail.com)
by mx145.mail.ru with esmtp id 1XYG1h-0008Bc-Uq
for kostoshir@mail.ru; Sun, 28 Sep 2014 19:04:42 +0400
X-Mru-BL: 0:0:1119
X-Mru-PTR: off
X-Mru-NR: 1
X-Mru-OF: Linux (Ethernet or modem)
X-Mru-RC: RU
Message-Id: <1411916681.3596610966@mx145.mail.r u>
From:
Date: Sun Sep 28 19:04:41 2014 (MSK)
Received: from localhost (amavis.sibmail.com [192.168.0.3])
by sibmail.com (Postfix) with ESMTP id 88AD823A653C
for <kostoshir@mail.ru>; Sun, 28 Sep 2014 22:04:41 +0700 (NOVT)
X-Virus-Scanned: amavisd-new at amavis.sibmail.com
X-Amavis-Alert: BAD HEADER, MIME error: error: couldn't parse head; error
near:; Hi!; It is a message for you; and fuck you!
Received: from sibmail.com ([77.106.108.226])
by localhost (amavis.sibmail.com [192.168.0.3]) (amavisd-new, port 10024)
with ESMTP id Alz52qpQCGxh for <kostoshir@mail.ru>;
Sun, 28 Sep 2014 22:04:40 +0700 (NOVT)
Received: from HOST (unknown [46.236.164.69])
by sibmail.com (Postfix) with ESMTPA
for <kostoshir@mail.ru>; Sun, 28 Sep 2014 22:04:40 +0700 (NOVT)
TO:KOSTE
SUBJECT: test
X-Spam: Probable Spam
X-DMARC-Policy: no
X-Mras: Ok
X-Mru-AVCheck: false
X-Spam-Flag: YES

Hi!
It is a message for you!

.
Подскажите, пожалуйста, в чем может быть дело, почему в первом случае я не могу прочитать сообщение

Последний раз редактировалось Stilet; 12.10.2014 в 19:24.
Joose вне форума Ответить с цитированием
Старый 12.10.2014, 19:21   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

sslStr.Read() может прочесть НЕ ВСЕ содержимое потока, потому оно и возвращает в качестве результата число прочитанных байт. Попробуйте добавить streamreader и использовать streamreader.readtoend например
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 12.10.2014, 20:11   #3
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Спасибо, но к сожалению в этом случае возникнет проблема с ssl шифрованием. Возможно есть способ гарантированно прочитать поток до конца средствами sslStream?
Joose вне форума Ответить с цитированием
Старый 12.10.2014, 21:17   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

streamreader - это просто обертка над потоком, которым является ваш sslStream, откуда там проблема шифрования-то возникнет?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со связью TCPclient и TCPserver Siemka Работа с сетью в Delphi 1 09.03.2013 23:26
Проблема с чтением файла. the27mart Общие вопросы C/C++ 4 18.11.2012 22:36
TCPServer и TCPClient на indy 10, Отправка сообщения с сервара pomkalk Работа с сетью в Delphi 3 01.04.2011 11:52
проблема с чтением из файла salwator Помощь студентам 1 23.12.2010 12:11
Проблема в связке TcpClient TcpServer registr911 Работа с сетью в Delphi 2 26.08.2010 12:55