Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> POP3 клиент, как правильно получать ответ 
:(
    Опции темы
kotkota23
Дата 26.9.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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





запускаю программу, выбираю функцию логин, ввожу всё, в ответ приходит
+OK
+OK Welcome!

а вот потом следует очень долгая пауза длинной в несколько минут и только потом заветное "end of sub", почему?
потом выбираю функцию stat, и мне выводится непонятное 234->5 и не выводится так нужное "stat"

Это сообщение отредактировал(а) kotkota23 - 11.10.2011, 09:29
PM MAIL   Вверх
shamber
Дата 26.9.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Цитата(kotkota23 @  26.9.2011,  09:47 Найти цитируемый пост)
долгая пауза длинной в несколько минут

вам не кажется что это таймаут?
PM MAIL Jabber   Вверх
kotkota23
Дата 26.9.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



shamber, хм, а вышло время чего именно? как это исправить?
PM MAIL   Вверх
shamber
Дата 26.9.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Сервер не увидел от вас активности и отключился.
посмотрите код вот здесь
может мысли какие появятся.

Это сообщение отредактировал(а) shamber - 26.9.2011, 10:22
PM MAIL Jabber   Вверх
kotkota23
Дата 26.9.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

        while ($newdata) { my $tmp_data = ""; # читаем пока в сокете  хоть что-то есть...
            recv(Server, $tmp_data, $maxlen, $flags);
            if (!$tmp_data) { $newdata = 0; }
            $data_read .= $tmp_data;
            print $tmp_data;
        }


разве этот цикл работает до тех пор пока сервер не отключится? ведь $newdata в конце то концов станет пустой, а если эта переменная не пустая, то тогда должно что то выводиться на экран, разве я не прав?
PM MAIL   Вверх
ginnie
Дата 26.9.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, добавьте warn time(); до и после recv(Server, $tmp_data, $maxlen, $flags); и увидите сколько раз вызывается эта функция и сколько она работает.

Добавлено через 8 минут и 51 секунду
kotkota23, у меня вот какой к Вам вопрос. Читаю rfc 1939:
Код

Commands in the POP3 consist of a case-insensitive keyword, possibly
followed by one or more arguments.  All commands are terminated by a
CRLF pair.

а у Вас я никаких CRLF не вижу после комманд. Почему?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 26.9.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie
у меня ощущение что вы намекаете на что то предельно простое, что тем не менее я предельно не понимаю)
запускается функция  recv(Server, $tmp_data, $maxlen, $flags);    6 раз
а значит что то внутри цикла тянет время, и я никак не могу понять что, и почему
PM MAIL   Вверх
ginnie
Дата 26.9.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



А что она эти 6 раз возвращает? И по временным отметкам не видно, что его "тянет"?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 26.9.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie, не видно(
видимо дело не в этом цикле, ибо заменив на простое
Код

   while(<Server>) {
      print $_;
   }    

проблема осталась прежней
PM MAIL   Вверх
ginnie
Дата 26.9.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, а зачем Вам вообще этот цикл? На первой итерации читается ответ сервера на PASS, а на второй итерации цикла читать нечего, поэтому происходит ожидание чтения до таймаута соединения с сервером. 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 26.9.2011, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie, у мэйлру отчего то два ответа на PASS
один +OK и после него +OK Welcome!
как по вашему лучше организовать чтение?
PM MAIL   Вверх
ginnie
Дата 26.9.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, а почему у меня работает не так? Вот моя сессия:

Код

telnet pop.mail.ru 110
Trying 94.100.184.74...
Connected to pop.mail.ru.
Escape character is '^]'.
+OK
user [email protected]
+OK
pass xxxxxxx
+OK Welcome!
quit
+OK POP3 server at mail.ru signing off
Connection closed by foreign host.



Это сообщение отредактировал(а) ginnie - 26.9.2011, 13:46


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 26.9.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



решение найдено, я просто не учел что после коннекта одно сообщение приходит, тем самым каждый раз выводился "предыдущий" ответ

но второй вопрос всё еще актуален
почему ловится таймаут при выполнении этой функции?

Код

sub stats {
   print "stats\n";
   print Server "list";
   
   $answer= <Server>;
   print "-> $answer";
   
}

PM MAIL   Вверх
ginnie
Дата 26.9.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, а добавление CRLF после команды ничего не меняет?

Это сообщение отредактировал(а) ginnie - 26.9.2011, 15:30


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 26.9.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie, и впрямь, невнимательно RFC читал
а как CRLF выцепить из ответа сервера?
тоесть последний многострочный ответ это точка и два CRLF символа, как это цепануть?
PM MAIL   Вверх
ginnie
Дата 26.9.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, всегда полезно проанализировать чужой код, например, смотрим Net::POP3, там используется метод read_until_dot() из Net::Cmd.
Или я неверно понял Ваш вопрос?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 26.9.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



\.\n\r
PM MAIL Jabber   Вверх
kotkota23
Дата 27.9.2011, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо! много полезных мелочей подхватил для себя, вот он как полезен, опыт;)
сейчас столкнулся с проблемой перекодировки, как заставить модуль Encode переводить из utf-8 в cp-1251? я так понимаю он то мне и нужен

Это сообщение отредактировал(а) kotkota23 - 27.9.2011, 10:16
PM MAIL   Вверх
kotkota23
Дата 27.9.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



понять не могу, почему не работает такой кусок

Код

use Encode;

...

   while(1) {
      last if($answer =~ /^\.\r?\n/o);
      $answer=<Server>;
      $data = from_to($answer, "utf-8", "cp1250");
      print "-> $data";
   }

PM MAIL   Вверх
Pfailed
Дата 27.9.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(kotkota23 @  27.9.2011,  10:21 Найти цитируемый пост)
понять не могу, почему не работает такой кусок

Идёте по шагам своего предшественника: http://forum.vingrad.ru/index.php?showtopi...t&p=2328655


--------------------
PM MAIL   Вверх
kotkota23
Дата 27.9.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



чёрт возьми, какой позор! а ведь я юзал и юзал поиск...
PM MAIL   Вверх
kotkota23
Дата 28.9.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

sub retr {
   print Server "retr $_[0]\n";
   $data="";
   while(1) {
      last if($answer =~ /^\.\r?\n/o);
      $answer=<Server>;
      $data.=$answer 
   }
   
   Encode::from_to($dataa, "KOI8-R", "cp866");
   print $data;
}


почему таки консоль виндовая выводит ересь?
PM MAIL   Вверх
ginnie
Дата 28.9.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, $dataa - это опечатка в сообщении или в программе?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 28.9.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



опечатка
тоесть перевод из кодировки в кодировку есть, но сама консоль не выводит
пробовал ср1251 и ср866
PM MAIL   Вверх
ginnie
Дата 28.9.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Если не сложно, добавьте вывод $data до from_to()  и покажите обе строки (как они выводятся на консоль).

Это сообщение отредактировал(а) ginnie - 28.9.2011, 16:48


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kotkota23
Дата 5.10.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



моя ошибка была не увидеть Quoted Printable
теперь я декодирую письмо, в файл выходит красивая кириллица
но в консоль всё также иероглифы

я использую

Код

Encode::from_to($a, "KOI8-R", "cp1251");


и вот что получается в консоли
1.в кодировке 1251
http://saveimg.ru/show-image.php?id=3dfef0...6f454e95da0aad6

2.в кодировке 866
http://saveimg.ru/show-image.php?id=2a84cc...e2792e3ae25b2c9
PM MAIL   Вверх
ginnie
Дата 5.10.2011, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



kotkota23, добавьте в код
Код

use Devel::Peek;


и перед строчкой Encode::from_to() добавьте
Код

Devel::Peek::Dump($a);


посмотрим, что у Вас в переменной записано, т.к. в консоли явно utf8, только неверно выведенное.

Это сообщение отредактировал(а) ginnie - 5.10.2011, 12:30


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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