Приветствую!
Вот есть необходимость написать свой маленький ФТП сервер на перле.
Начало есть, но проблема в том что я немогу читать то что поидее должен мне отправлять ФТП клиент!
Использую порт 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;
}