Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   Perl non blocked socket (http://forum.oszone.net/showthread.php?t=131395)

lcat 09-02-2009 01:16 1033222

Perl non blocked socket
 
Код:

#!/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);
                                }

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


Время: 15:05.

Время: 15:05.
© OSzone.net 2001-