pop3 (perl)

Модератор: Модераторы разделов

Аватара пользователя
nuclear17
Сообщения: 117
ОС: linux/mac/win

pop3

Сообщение nuclear17 »

Пытаюсь написать простейший поп3 сервер

Код: Выделить всё

#!/usr/bin/perl
use Socket;
use constant POP3PORT => 110;
my $timeout=120;
my $proto = getprotobyname('tcp');
my $port =110;
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
bind(SOCK, sockaddr_in(POP3PORT, INADDR_ANY)) || die "bind: $!";
listen(SOCK, SOMAXCONN) || die "listen: $!";


my $auth=0;
my $i=0;

while(!$auth)
 {

accept (NEWSOCK,SOCK);

if($i==0)
{
print 'test';
print NEWSOCK "+OK POP3 server ready\r\n";
 close NEWSOCK;
 $i=1;
 next;
}
my $authline=<NEWSOCK>;
print $authline;
 if ( $authline =~ /USER\s+(.*)/i ) {
        $user_input = lc( $1 );
        $user_input =~ s/[\/\\\0|\n\r]//g;
                $user=$1;
        print NEWSOCK "+OK Please give password.\r\n";
        $username_given = 1;
    }
    elsif ( $authline =~ /PASS\s+(.*)$/i && $username_given )
        {
        $pass = $1;
        $pass =~ s/[\n\r]//g;
                if($user_input eq '123' && $pass eq '123')
                 {
                  $auth=1;
                  print NEWSOCK "+OK Pass accepted";
                 }
        }
      else
        {
         #print 'test';
        #  print NEWSOCK "+OK POP3 server ready\r\n";
        }
      $i=1;
      close NEWSOCK;
#
}


close(SOCK);


при вызове close NEWSOCK; закрывается соединение с клиентом, а без него в сокет не пишет. Как можно писать в сокет не закрывая его?
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: pop3

Сообщение pcodr »

s/print NEWSOCK "+OK Pass accepted";/print NEWSOCK "+OK Pass accepted\r\n";/

Без переноса строки сообщение не поступит в сокет, а попадет в буфер. Для небуферизированного ввода/вывода используют sysread/syswrite или устанавливают переменную $| для сокета в истинное значение.
remote system type is unix
Спасибо сказали: