The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Свой FTP Server"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Свой FTP Server"  
Сообщение от Dimitry (??) on 08-Сен-06, 11:18 
Приветствую!
Вот есть необходимость написать свой маленький ФТП сервер на перле.
Начало есть, но проблема в том что я немогу читать то что поидее должен мне отправлять ФТП клиент!
Использую порт 210 - может фтп сервер устроен так что работает того на 21 ?
В фтп клиенте 210 ставил.

1. Сервер запущен
2. Клиент подключается
3. Сервер отправляет 200 - я готов
4. Клиент авторизуется USER username (вот как раз тут всё и остановилось, с сокета не читает ничего, как будто клиент ничего не отправляет)
5. Сервер говорит - 331 мне нужен пароль!
6. Клиент отправлет PASS *****(этого я тоже не могу получить)

STATUS:>      Socket connected. Waiting for welcome message...
        220 "FTP-server."
STATUS:>      Connected. Authenticating...
COMMAND:>    USER user
        331 Please specify the password.
COMMAND:>    PASS *****


Какие виды чтения из сокета я токо не пробовал
<CLIENT>
recv
read
gets(getc)
ничего не помогает!

Если зайти по адресу http://domain.ru:210/ то тогда читает HEADER GET ...

Ниже код сервера, буду благодарен за любые подсказки и ссылки!

#!/usr/bin/perl

use Socket;
use Fcntl;


$| = 1;


# use port 7890 as default
my $port = shift || 210;
my $proto = getprotobyname('tcp');

# create a socket, make it reusable
socket(SERVER, AF_INET, SOCK_STREAM, $proto) or die "socket: $!";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1) or die "setsock: $!";

# grab a port on this machine
my $paddr = sockaddr_in($port, INADDR_ANY);

# bind to a port, then listen
bind(SERVER, $paddr) or die "bind: $!";
listen(SERVER, SOMAXCONN) or die "listen: $!";
print "SERVER started on port $port\n";

# accepting a connection
my $client_addr;
while ($client_addr = accept(CLIENT, SERVER)) {
nonblock(CLIENT);
    # find out who connected
    my ($client_port, $client_ip) = sockaddr_in($client_addr);
    my $client_ipnum = inet_ntoa($client_ip);
    my $client_host = gethostbyaddr($client_ip, AF_INET);
    # print who has connected
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
if($sec<10) {$sec="0$sec";}if($min<10) {$min="0$min";}if($hour<10) {$hour="0$hour";}
if($mday<10) {$mday="0$mday";} $mon++;if($mon<10) {$mon="0$mon";} $year+=1900;
$i++;
if(defined $client_host ) {$host=$client_host;} else {$host="";}
$output="$year-$mon-$mday $hour:$min:$sec got a connection from: $host [$client_ipnum]\n";
print $output;


    # send them a message, close connection
    print CLIENT "220 FTP Server ready.\r\n";

    sleep(1);


#my ($buffer) = '';
#recv(CLIENT, $buffer, 10000, 0);
#print "$buffer\n";

    print CLIENT "331 Password required for xxx.\r\n";

    print CLIENT "230 User beispiel logged in.\r\n";


$buf="";
recv CLIENT,$buf,100,0;
print $buf;

    close CLIENT;

}
sub nonblock {
    my $socket = shift;
    my $flags;
    my $ok = 0;
    eval('$flags = fcntl($socket, F_GETFL, 0) or  die "PIPE"; fcntl($socket, F_SETFL, $flags | O_NONBLOCK ) or die "PIPE"; $ok = 1;');
    return $ok;
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Свой FTP Server"  
Сообщение от ACCA (ok) on 08-Сен-06, 23:03 
>Приветствую!
>Вот есть необходимость написать свой маленький ФТП сервер на перле.

Не нужно писать свою реализацию FTP протокола, это бессмысленная трата времени.

Поставь с CPAN Net::FTPServer, если сервер нужен позарез, но лучше обойтись совсем без него.

Есть другие, более безопасные альтернативы, например ssh/scp/sftp.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Свой FTP Server"  
Сообщение от Dimitry (??) on 09-Сен-06, 00:23 
Так то оно так, просто хотелось чтобы простые юзеры вместо вебфтп использовали нормальный фтп клиент - просто другой порт и всё)
Впринцепи то ничего сложного, но вот немогу перехватить инфу от клиента и всё ..
А безопастность это уже другой вопрос..
Ладно пока перебьюсь без такой фичи..
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Свой FTP Server"  
Сообщение от wwwdev (ok) on 09-Сен-06, 03:38 
В перле я не силен )) но поддержать энтузиазм автора хочется ))

Что-то мне подсказывает, что при работе с неблокирующим сокетом надо использовать select() для определения готовности на чтение, а уже потом читать. Или в перле это не так?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Свой FTP Server"  
Сообщение от Асен Тотин email on 09-Сен-06, 21:20 
Привет,

Socket.pm, конечно, это класс, но почему все-таки не пользуетесь IO::Socket  и IO::Select? Гораздо быстрее, все на двух строчках уложится и работать будет без проблем...

WWell,

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Свой FTP Server"  
Сообщение от Dimitry (??) on 10-Сен-06, 00:57 
И действительно через селекты получилось ) Спасибо!
Но не сразу, пришлось добавить
use POSIX qw(:errno_h :fcntl_h :float_h :limits_h :math_h :pwd_h :signal_h :stdio_h :string_h :sys_wait_h :unistd_h);

а без этой строки просто дисконектился почему то сам без ошибок )
Ладно, начало есть, теперь займёмся обработкой комманд, и кто знает.. может что получится =)

Кстати получилось маленький ХТТП сервер написать(для практики), хотел хоть как то через него пхп скрипт запустить, конечно можно `php -f script.php` но одна проблема, переменные невозможно передать :/// (ну это уже совсем другая история) =)


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру