Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает повторный вызов функции  (Прочитано 6014 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rapa
Гость
« : 08-12-2005 22:18 » 

Народ.Я уже обращался с этой проблеммой,но возможно мне не удалось правильно объяснить ,какая загвоздка,поэтому попробую ещё раз. Я пишу программу,которая подключается к серверу "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 настояшие.Я открыл ящик толко из-за этого.
Помогите решить проблему
« Последнее редактирование: 15-12-2007 16:58 от Алексей1153++ » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-12-2005 14:15 » 

Не знаю, у меня вообще не заработал
USER pop3corn
        +OK
PASS 12345
        +OK pop3corn@mail.ru maildrop has 3 messages (5870 octets)
+OK Capability list follows
NEVER

А так, я полагаю, проблема может быть в StreamReader.  После первого вызова Capability ты бросаешь StreamReader.  Возможно, сборщик мусора его подбирает.  В документации сказано, что при закрытии StreamReader закрывается базовый поток, в данном случае NetworkStream, а в месте с ним и сокет.  Вполне возможно, что после первого вызова соединение с сервером закрывается.
Тебе надо хранить не NetworkStream а StringReader
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines