Perl non blocked socket

Ответить
Аватара пользователя
lcat

Perl non blocked socket

Сообщение lcat »

Код:

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

#!/usr/bin/perl -w
use strict;
use IO::Socket;
use IO::Select;
use constant LBUFF => 2048;
$|=1;
my($pid,@read,$buffer,$fh,$count);
my $port = shift || 45012;
$SIG{'ALRM'} = sub { exit(1); };
my $socket = IO::Socket::INET->new(LocalPort => $port,
                                   Listen => 5,
				 ReuseAddr => 1,
                                   Proto => 'tcp',
                                   Timeout => 30);
print "Listen ".$socket->sockhost.":".$socket->sockport."\n";
my $session=$socket->accept || die("$!");
syswrite(STDOUT,"to: ".$session->sockhost.":".$session->sockport. " from: ".$session->peerhost.":".$session->peerport."\n");
my $s=IO::Select->new() || die("Can't create Select obj : $!");
$s->add(\*STDIN);
$s->add($session);
STDIN->blocking(0);
$session->blocking(0);
while(1){
	@read=$s->can_read();
	foreach $fh(@read){
		if($fh == \*STDIN){
			while(my $count=sysread(STDIN,$buffer,LBUFF)){
# 				syswrite(STDOUT,"STDIN\n");
				syswrite($session,$buffer);
			}
		}
		if($fh == $session){
			while($count=sysread($session,$buffer,LBUFF)){
				syswrite(STDOUT,$count."\n");
				syswrite(STDOUT,$buffer);
				unless(defined($count) && length($buffer)){
					$s->remove($session);
					$session->shutdown(2);
					exit(1);
				}
			}
		}
		syswrite(STDOUT,"EXIT\n");
	}
}

Как отловить закрытие сокета другой стороной, Участок кода



Код:

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

unless(defined($count) && length($buffer)){
					$s->remove($session);
					$session->shutdown(2);
					exit(1);
				}

Как я понимаю должен это делать но ничего не работает, посоветуйте как исправить Изображение
Ответить

Вернуться в «Программирование в *nix»