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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FTP-клиент (без CPAN модулей) 
V
    Опции темы
Nаtаshа
Дата 9.10.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго всем вечера! Хочу просить у вас совета и помощи. Необходимо реализовать на perl FTP-клиент, а именно возможность скачать и закачать файл с/на сервер. Впринципе с use Net::FTP решить вопрос просто. Но в том то и фишка что пользовать средства CPAN  запрещено(условия задания). Вопрос заключается в том, что посоветуете использовать, способы решения, пример и т.д. (т.е. хотя бы скажите в какую сторону копать). В perl я зеленый новичек. Заранее спасибо.
PM MAIL   Вверх
dixoNICH
Дата 9.10.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



perldoc socket
rfc 959
PM MAIL   Вверх
Nаtаshа
Дата 10.10.2011, 00:19 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не помогло. smile 

Это сообщение отредактировал(а) Nаtаshа - 10.10.2011, 00:19
PM MAIL   Вверх
taryk
Дата 10.10.2011, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Впринципе с use Net::FTP решить вопрос просто. Но в том то и фишка что пользовать средства CPAN  запрещено(условия задания)


Думаю никто не запретит вам посмотреть исходники модуля Net::FTP и по аналогии реализовать свой ftp-клиент.
PM MAIL   Вверх
Pfailed
Дата 10.10.2011, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Алгоритм такой:
1. Открыть сокет
2. Залогиниться 
Цитата

USER yourlogin
PASS yourpassword

3. Перейти в бинарный режим
Цитата

TYPE I

4. Перейти в пассивный режим
Цитата

PASV

5. Открыть сокет к адресу указанному сервером в ответе
6. Для загрузки на сервер в сокет открытый на шаге 1
Цитата

STOR yourfilename

А в сокет открытый на шаге 5 передаём файл

Для загрузки с сервера в сокет 1
Цитата

RETR yourfilename

Из сокета 5 считываем файл.


На всех шагах неплохо бы делать проверки на ошибки.
У меня есть простейший клиент ftp на C, если нужно скину.


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


Новичок



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

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



Pfailed, как я понимаю вы привели  команды, которые понимает FTP-сревер. Алгоритм ясен. Но вот реализация вводит в ступор. Как перейти в бинарный режим и т.д. ? Моего уровня не хватает что бы понять как это сделать.Как создать сокет и установить соединение уже разобралась, а вот дальше как отсылать или что получать это уже не ясно.
Цитата

У меня есть простейший клиент ftp на C, если нужно скину.

Си я сносно знаю. С++ лучше. Думаю,что может эта программа чем то поможет мне.Говорят си и perl похожи.

Очень вам благодарна.

taryk, 
Если честно, то это немного сложновато для меня. 
PM MAIL   Вверх
Pfailed
Дата 10.10.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все функции по работе с ftp в ftp.c, в том числе загрузка/выгрузка файлов
В main.c примеры вызова функций. 

Вообще да, в Perl функции по работе с сокетами примерно такие же, в остальном всё еще проще.


Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  ftp.zip 6,82 Kb


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


Новичок



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

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



Код

use Socket;

$host= "xradio.su"; # публичный сервер 
$port="21";
$userid= 'anonymous'; 
$userpass= "[email protected]"; 

if(!socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname("tcp")))
{
    print "FAILED\n";
    exit(1);
}

$iaddr = inet_aton($host);
if(!$iaddr)
{
    print "FAILED\n";
    exit(1);
}

$paddr = sockaddr_in($port, $iaddr);
if(!connect(SOCK, $paddr))
{
    print "FAILED\n";
    exit(1);
}


$data="";
$listnum = "";
if(!recv(SOCK,$data,1000,0))
{
    print "FAILED\n";
    exit(1);
}
print  " ---->: $data\n";

#Логинимся и переходим в бинарный режим
.....

#Переходим в пассивный режим
print "Passive mode ... ";
if(!send(SOCK,"PASV\n",0))
{
    print "FAILED\n";
    exit(1);
}
if(!recv(SOCK,$listnum,1000,0))
{
    print "FAILED\n";
    exit(1);
}
print "OK!!!!\n$listnum\n";


print "CWD xfiles\n";
if(!send(SOCK,"CWD xfiles\n",0))
{
    print "FAILED\n";
    exit(1);
}
if(!recv(SOCK,$listnum,1000,0))
{
    print "FAILED\n";
    exit(1);
}
print "OK!!!!\n$listnum\n";


print "CMD Alex999\n";
if(!send(SOCK,"CWD Alex999\n",0))
{
    print "FAILED\n";
    exit(1);
}
if(!recv(SOCK,$listnum,1000,0))
{
    print "FAILED\n";
    exit(1);
}
print "OK!!!!\n$listnum\n";


open(F1,"0502.MP3");

print "RETR file\n";
if(!send(SOCK,"RETR 0502.MP3\n",0))
{
    print "FAILED\n";
    exit(1);
}
if(!recv(SOCK,$data,1000,0))
{
    print "FAILED\n";
    exit(1);
}
print(F1 "$data");  #вывод в файл

while(<SOCK>)
{
    sysread(SOCK,$data,1024);        
    print(F1 "$data");  #вывод в файл
}

close(F1);

close(SOCK);

exit(0);




ВЫХОД
Цитата


---->: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------

220-You are user number 1 of 50 allowed.

220-Local time is now 20:54. Server port: 21.

220-IPv6 connections are also welcome on this server.

220 You will be disconnected after 15 minutes of inactivity.


OK
Starting autentification ...  ----->: 230-Your bandwidth usage is restricted


 ----->230 Anonymous user logged in


 ----->: 230 Any password will work


Binary mode ... OK!!!!

 ----->200 TYPE is now 8-bit binary


Passive mode ... OK!!!!

 ----->227 Entering Passive Mode (193,203,60,110,39,129)


CWD xfiles
OK!!!!

 ----->250 OK. Current directory is /xfiles


CMD Alex999
OK!!!!

 ----->250 OK. Current directory is /xfiles/Alex999


RETR file
а дальше висяк  smile  



Я понимаю, что надо как то выдрать адрес с ответа "227 Entering Passive Mode (193,203,60,110,39,129)" и установить соединение, но моих знаний perl уже не хватает. А потом еще и записать данные в файл.
Помогите пожалуйста! Заранее спасибо.
PM MAIL   Вверх
Pfailed
Дата 15.10.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



См. функцию ftp_addr_from_pasv_response() в ftp.c
Вытащить цифры из этой строки в Perl можно с помощью регулярного выражения:
Код

my ($ip_1, $ip_2, $ip_3, $ip_4, $port_1, $port_2) = "227 Entering Passive Mode (193,203,60,110,39,129)" 
   =~ /Entering Passive Mode\s+\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/;


Это сообщение отредактировал(а) Pfailed - 15.10.2011, 20:55


--------------------
PM MAIL   Вверх
Nаtаshа
Дата 16.10.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код


open(F1,"0502.MP3");

...


my ($ip_1, $ip_2, $ip_3, $ip_4, $port_1, $port_2) = $listnum 
   =~/Entering Passive Mode\s+\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/;


if(!socket(SOCK2, PF_INET, SOCK_STREAM, getprotobyname("tcp")))
{
    print "FAILED\n";
    exit(1);
}

close(F1);


К сокету, полученному от сервера в ответ на PASV коннестится норм.
В Файл ничего не записывается, что делаю не так?. Хотя данные на SOCK2 приходят.

Это сообщение отредактировал(а) Nаtаshа - 18.10.2011, 00:01
PM MAIL   Вверх
Pfailed
Дата 16.10.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Nаtаshа, из очевидного:
Код

...
open(F1,"0502.MP3");
...

Вы открыли файл для чтения, но пытаетесь в него записать. Для записи файл открывается так, например:
Код

open(F1,">0502.MP3");



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


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

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


 




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


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

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