URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1056
[ Назад ]

Исходное сообщение
"pop3 client на перле без pop3.pm и т.п. напрямую через сокет"

Отправлено mambur , 24-Окт-02 15:18 
пишу
  $sock = new IO::Socket::INET (PeerAddr => "$pop3",
                               PeerPort => 110,
                               Proto    => 'tcp',
                               );

    print $SOCK "USER myuser\r\n";
    while ( $so=<$sock> ){
      print "$so\n";
    }
    print $sock "pass my_secret_password\r\n";
    while ($so=<$sock>){
      print "$so\n";
    }
    print $sock "list\r\n";
    while ($so=<$sock>){
      print "$so\n";
    }

получается что-то вроде вечных циклов, а напрямую телнетом все работает!
научите как правильно. Просьба использование модулей типа ВСЁ_РАБОТАЕТ.pm не предлагать.
Спасибо.


Содержание

Сообщения в этом обсуждении
"RE: pop3 client на перле без pop3.pm и т.п. напрямую через сокет"
Отправлено J , 24-Окт-02 20:19 
>пишу
>  $sock = new IO::Socket::INET (PeerAddr => "$pop3",
>                               PeerPort => 110,
>                               Proto    => 'tcp',
>            
>          
>        );
>
>    print $SOCK "USER myuser\r\n";
>    while ( $so=<$sock> ){
>      print "$so\n";
>    }
>    print $sock "pass my_secret_password\r\n";
>    while ($so=<$sock>){
>      print "$so\n";
>    }
>    print $sock "list\r\n";
>    while ($so=<$sock>){
>      print "$so\n";
>    }
>
>получается что-то вроде вечных циклов, а напрямую телнетом все работает!
>научите как правильно. Просьба использование модулей типа ВСЁ_РАБОТАЕТ.pm не предлагать.
>Спасибо.

@answer = <$sock>;
так не пойдет?


"RE: pop3 client на перле без pop3.pm и т.п. напрямую через сокет"
Отправлено XMan , 24-Окт-02 23:50 
А чего ты ожидал ? Программа останавливает на первом же цикле, потому как ты ждешь, пока сервер тебе чего-то зашлет, а тем временем сервер ждет, пока ты ему чего-то зашлешь. То есть, ошибка алгоритмическая. В цикле ты должен анализировать, что сказал тебе сервер и реагироывать соответственно. Вернулась от сервера строка с подтверждением логина и запросом пароля - дать пароль. И т.д.
Живой пример:

print $sock "USER username\n";
print $sock "PASS password\n";
print $sock "LIST\n";
while (<$sock>) {
  s/\r|\n//;
  print "$_\n";
  last if ($_ eq '.');
};

Тоже работает без анализа. Только одна проверка - точка в конце списка. После чего - выход.