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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Net::FTP и кол-во попыток соединения 
:(
    Опции темы
Sugar84
Дата 20.9.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый вечер.

Есть примерно такой код (сократил чтобы упростить):
Код

use Net::FTP;

my $ftp = Net::FTP->new($serv_name, Debug => 1, 
    Passive => $passive, Timeout => $timeout, );
$ftp->login($user, $passw);

# skipped code
foreach my $file (@files_to_cp) {
    $ftp->put($file);
}


При доступе к одному из серверов   файлы копируются с переменным успехом, в случае удачи программа выдает такое:
Код

Net::FTP=GLOB(0x83121b8)<<< 227 Entering Passive Mode (208,75,230,189,241,167)
Net::FTP=GLOB(0x83121b8)>>> STOR image020.jpg
Net::FTP=GLOB(0x82ceabc)<<< 150 Accepted data connection

и идет дальше.

В случае неудачи получаю такое вот:
Код

Net::FTP=GLOB(0x83121b8)<<< 227 Entering Passive Mode (208,75,230,189,241,167)
Net::FTP=GLOB(0x83121b8)>>> STOR image020.jpg

И вот так скрипт долго висит (2-3  минуты), затем  вылетает с ошибкой:
Код

Can't use an undefined value as a symbol reference at /usr/lib/perl5/vendor_perl/Net/FTP/dataconn.pm line 54.

При этом в tcpdump видно что к серваку улетают syn-пакеты на нужный порт (5 штук), но ответа нету, в нетлисте подключение висит со статусом "synsnt".

Если подправить цикл вот так:
Код

COPY:
foreach my $file (@files_to_cp) {
    eval { $ftp->put($file) };
    if ($@) {
        eval { $ftp->put($file) };
        #+ код счетчика неудачных попыток
}


Происходит то же самое, но вылетает уже с такой ошибкой:
Код

Net::FTP=GLOB(0x82ceabc): Timeout at /home/sugar/name_of_script.pl line 76 
# (кол-во сообщений равно кол-ву неуд. попыток)
Net::FTP: Unexpected EOF on command channel at /home/sugar/Documents/perl/dynamic_ip/ftp_client.pl line 76


Долго думал как это косяк c eval обойти,  и придумал вот такое решение:
Код

PUT:
foreach my $file (@files_to_cp) {
    eval { $ftp->put($file) };
    if ($@) {
        $ftp->close;
        LOGIN:
        while (1) {
            eval { $ftp = Net::FTP->new($serv_name, Debug => 1,
                    Passive => $passive, Timeout => $timeout, );
                $ftp->login($user, $passw) 
                $ftp->cwd($dir_to_copy) };

            next LOGIN if $@;
            last LOGIN;
        }
        redo PUT;
    }
}


Но оно мне кажется громоздким, уродливым и ээ... неправильным

Вопрос 1: можно ли как-то через интерфейс к Net::FTP задать кол-во попыток подключения , т.е. чтоб скрипт не тупо кидал synsent на один порт, а несколько раз пытался именно открыть новое tcp-соединение. Облазил документация и код модулей Net::FTP, Net::FTP::dataconn, IO::Socket, IO::Socket::INET но так ничего и не смог найти.

Вопрос 2: Как задать таймаут соединения? Несмотря на задаваемый параметр Timeout (ставлю 10, 20 и .д.) скрипт все равно висит около 2-3 минут при посылании synsent.

Спасибо за ответы.
PM MAIL   Вверх
Pfailed
Дата 2.10.2010, 07:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На cpan есть модуль Net::FTP::AutoReconnect. Думаю стоит его посмотреть.


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


Новичок



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

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



Спасибо, задачу уже решил, но это отличный модуль.
В следующий раз буду иметь в виду! =)
PM MAIL   Вверх
ucb1
Дата 24.4.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так в чем же решение

и где найти примеры использования Net::FTP::Autoreconnect

cpan перечисляет комманды без usage  smile 
PM MAIL   Вверх
Pfailed
Дата 25.4.2012, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ucb1 @  24.4.2012,  14:58 Найти цитируемый пост)
и где найти примеры использования Net::FTP::Autoreconnect

Использовать точно также, как Net::FTP.


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


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

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


 




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


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

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