Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает повторный вызов функции, Не работает повторный вызов функции 
:(
    Опции темы
rapa
Дата 9.12.2005, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 2.6.2005

Репутация: нет
Всего: нет



Народ.Я уже обращался с этой проблеммой,но возможно мне не удалось правильно объяснить ,какая загвоздка,поэтому попробую ещё раз. Я пишу программу,которая подключается к серверу "POP3" ,соответственно реализует все его
базовые команды как USRE,PASS,LIST и т.д.Так же она должна проверять почту,но не посылать её.
Вот так я подлучаюсь к серверу:
Код

   public class POP3
{
        #region PRIVATE_DATA

         private TcpClient clientSocket;
         private string serverName;
         private int port;
         private string userName;
         private string password;
         private NetworkStream netStrm;
         private bool bIsConnected;

         private const string POP_STATUS_FAILURE = "-ERR";
         private const string POP_STATUS_SUCCESS = "+OK";

         #endregion

        #region POP3_CONSRACTOR

         public Pop3( string serverName , string userName , string password )
         {
             this.serverName=serverName;
             this.userName=userName;
             this.password=password;
             this.port=110;
             //this.netStrm = clientSocket.GetStream();
             this.Connect( serverName , userName , password );
            // bIsConnected = false;
         }

         #endregion
         #region CONNECT method

         public bool Connect( string sServerName , string sUserName , string sPassword )
         {  
             try
             {
                 clientSocket=new TcpClient( sServerName , port );
             }

             catch( SystemException e )
             {
                 Console.WriteLine( "Invalid sServerName Or port" , e.Message );
                 Console.ReadLine();
                 return false;
             }

            // NetworkStream NetStrm = clientSocket.GetStream();
             netStrm = clientSocket.GetStream();
             //StreamReader RdStrm = new StreamReader( NetStrm );
             StreamReader RdStrm = new StreamReader( netStrm );

            // sendPOP3cmd( "USER "+ sUserName + " \r\n" , NetStrm );
            // sendPOP3cmd( "PASS "+ sPassword+ "\r\n" , NetStrm );
            
             sendPOP3cmd( "USER "+ sUserName + " \r\n" , netStrm );
             sendPOP3cmd( "PASS "+ sPassword+ "\r\n" ,  netStrm );
            
             bIsConnected = true;       // Update local flag
            return true;
         }

         #endregion
         #region SEND_POP3_CMD method

         //public string sendPOP3cmd( string cmd , NetworkStream NetStrm )
         public string sendPOP3cmd( string cmd , NetworkStream netStrm )
         {
             byte[] szData;
             string returnedData = "";
             //StreamReader RdStrm= new StreamReader( NetStrm );
             StreamReader RdStrm= new StreamReader( netStrm );
             szData = System.Text.Encoding.ASCII.GetBytes( cmd.ToCharArray() );
             //NetStrm.Write( szData , 0 , szData.Length );
             netStrm.Write( szData , 0 , szData.Length );
            
             if ( cmd == "LIST\r\n" )
             {
                 returnedData = RdStrm.ReadLine();
                 Console.WriteLine( cmd + "\r\n" + returnedData + "\r\n" );
                 while ( returnedData != "." )
                 {
                     returnedData = RdStrm.ReadLine();
                     Console.WriteLine( returnedData + "\r\n" );

                 }           
             }
             else
             {
                 returnedData = RdStrm.ReadLine();
                 Console.Write( cmd );
                 Console.WriteLine("\t" + returnedData );
             }
             return returnedData;
         }

         #endregion
         #region POP3_COMMAND method

         //public string    Pop3Command( string sCommand , NetworkStream onetStrm )
         public string  Pop3Command( string sCommand , NetworkStream netStrm )
         {
             byte[] sizeData;
             //string returnedData = "";
             StringBuilder sBuilder = new StringBuilder("");
            // netStrm = clientSocket.GetStream();
             //StreamReader RdStrm = new StreamReader ( onetStrm );
             StreamReader RdStrm = new StreamReader ( netStrm );
             sizeData = System.Text.Encoding.ASCII.GetBytes ( sCommand.ToCharArray() );
             //onetStrm.Write ( sizeData , 0 , sizeData.Length );
             netStrm.Write ( sizeData , 0 , sizeData.Length );
            
             try
             {
                 sBuilder.Append( RdStrm.ReadLine() );   
             }
             catch( Exception e )
             {
                 Console.WriteLine( e.Message );
             }

             return sBuilder.ToString();
         }

         #endregion

}



А вот в чём проблемма.Есть функция Capability.Она должна возвращать данные сервера,а в часности(в моём случае) LOGIN-DELAY и EXPIRE TIME,в зависимости от stringa который я ей передаю.
Проблемма в том,что когда я её запускю 2 раза подряд из maina,то первый раз она работает как надо,а во второы раз абсолютно не работает.Вот эта функция:
Код

#region CAPABILITY method

         public string Capabilty( string sComand)
         {
             string [] returnDataArr;
             string tmp = "";
             //netStrm = clientSocket.GetStream();
             StringBuilder returnData = new StringBuilder();
             StreamReader RdStrm = new StreamReader( netStrm );
             //returnData.Append( Pop3Command( "CAPA " + "\r\n " , netStrm ));
             returnData.Append( Pop3Command( "CAPA " + "\r\n " , netStrm ));
             
             Console.WriteLine( returnData.ToString());
        
             if( returnData.ToString().StartsWith( "+" ) )
                 {
                     returnData.Remove(0,returnData.Length);
                     while( !returnData.ToString().EndsWith( "." ) )
                     {
                         returnData.Append("\r\n");
                         returnData.Append( RdStrm.ReadLine());
                     }
                 }
                returnDataArr = returnData.ToString().Split('\n');

             foreach(string s in returnDataArr)
             {  
                 if( s.StartsWith(sComand) )
                  {                      
                     tmp = s;
                     break;
                   }
             }              
                 tmp = tmp.Remove(0,sComand.Length+1);
                 return  tmp ;               
              
             }

         #endregion

Про такой main я говорил:
Код

[STAThread]
        static void Main( string[] args )
        {   
             
            Pop3 temp = new Pop3("pop.mail.ru","pop3corn","12345");
            Console.WriteLine( temp.Capabilty("EXPIRE"));
            Console.WriteLine( temp.Capabilty("LOGIN-DELAY") );
            Console.ReadLine();
            
        }


P.S.
username на сервере и password настояшие.Я открыл ящик толко из-за этого.
Помогите решить проблему
PM MAIL   Вверх
Дрон
Дата 9.12.2005, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(rapa @ 9.12.2005, 01:32)
абсолютно не работает

Ну почему ж? Выдаёт вполне нормальную ошибку: Unknown command: "". Потом, правда, ещё валится с исключением, но оно к делу не относится.

Я протокола POP3 не знаю. Но погоняв минут десять твою прогу понял, в чём дело.

Вот эта строка посылает команду:
Код
 returnData.Append( Pop3Command( "CAPA " + "\r\n " , netStrm ));


В итоге на сервер уходит вот что: "CAPA, пробел, перевод строки и снова пробел", который трактуется уже как следующая команда. В результате ты и получаешь ошибку smile

ЗЫ: Что-то стиль кодирования у тебя очень странный -- как будто не до конца разобрался в том, что пишешь. Да и логика работы программы не очень понравилась: ведь чтобы получить и EXPIRE, и LOGIN-DELAY и другие параметры достаточно лишь один раз послать запрос на сервер.

ЗЗЫ: А зачем писать "CAPA " + "\r\n", когда можно "CAPA \r\n"? smile

Это сообщение отредактировал(а) Дрон - 9.12.2005, 02:24


--------------------
Да. Именно так.
PM   Вверх
rapa
Дата 9.12.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 2.6.2005

Репутация: нет
Всего: нет



Цитата

В итоге на сервер уходит вот что: "CAPA, пробел, перевод строки и снова пробел", который трактуется уже как следующая команда.


Но почему же тогда после первого запуска функции она работает как и ожидалось с теми же параметрами : "CAPA " + "\r\n " , netStrm ???
PM MAIL   Вверх
Дрон
Дата 9.12.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



rapa
Первый раз к нему приходит нормальная команда CAPA, а вот в начале следующей команды будет добавлен пробел, который у тебя написан после \r\n. Убери его и всё заработает.

Т.е. выглядит так (вместо пробела пишу "_")
Код
CAPA
_CAPA

Поэтому вторую команду он и не понимает.

Это сообщение отредактировал(а) Дрон - 9.12.2005, 11:52


--------------------
Да. Именно так.
PM   Вверх
rapa
Дата 9.12.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 2.6.2005

Репутация: нет
Всего: нет



Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.