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

Исходное сообщение
"Свой FTP Server"

Отправлено Dimitry , 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;
}


Содержание

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

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

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

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


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

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

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


"Свой FTP Server"
Отправлено Асен Тотин , 09-Сен-06 21:20 
Привет,

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

WWell,


"Свой FTP Server"
Отправлено Dimitry , 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` но одна проблема, переменные невозможно передать :/// (ну это уже совсем другая история) =)