io_multihomed.t

来自「source of perl for linux application,」· T 代码 · 共 132 行

T
132
字号
#!./perlBEGIN {    unless(grep /blib/, @INC) {	chdir 't' if -d 't';	@INC = '../lib';    }}use Config;BEGIN {    my $can_fork = $Config{d_fork} ||		    (($^O eq 'MSWin32' || $^O eq 'NetWare') and		     $Config{useithreads} and 		     $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/		    );    my $reason;    if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bSocket\b/) {	$reason = 'Socket extension unavailable';    }    elsif ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bIO\b/) {	$reason = 'IO extension unavailable';    }    elsif (!$can_fork) {        $reason = 'no fork';    }    if ($reason) {	print "1..0 # Skip: $reason\n";	exit 0;    }}$| = 1;print "1..8\n";eval {    $SIG{ALRM} = sub { die; };    alarm 60;};package Multi;require IO::Socket::INET;@ISA=qw(IO::Socket::INET);use Socket qw(inet_aton inet_ntoa unpack_sockaddr_in);sub _get_addr{    my($sock,$addr_str, $multi) = @_;    #print "_get_addr($sock, $addr_str, $multi)\n";    print "not " unless $multi;    print "ok 2\n";    (     # private IP-addresses which I hope does not work anywhere :-)     inet_aton("10.250.230.10"),     inet_aton("10.250.230.12"),     inet_aton("127.0.0.1")        # loopback    )}sub connect{    my $self = shift;    if (@_ == 1) {	my($port, $addr) = unpack_sockaddr_in($_[0]);	$addr = inet_ntoa($addr);	#print "connect($self, $port, $addr)\n";	if($addr eq "10.250.230.10") {	    print "ok 3\n";	    return 0;	}	if($addr eq "10.250.230.12") {	    print "ok 4\n";	    return 0;	}    }    $self->SUPER::connect(@_);}package main;use IO::Socket;$listen = IO::Socket::INET->new(Listen => 2,				Proto => 'tcp',				Timeout => 5,			       ) or die "$!";print "ok 1\n";$port = $listen->sockport;if($pid = fork()) {    $sock = $listen->accept() or die "$!";    print "ok 5\n";    print $sock->getline();    print $sock "ok 7\n";    waitpid($pid,0);    $sock->close;    print "ok 8\n";} elsif(defined $pid) {    $sock = Multi->new(PeerPort => $port,		       Proto => 'tcp',		       PeerAddr => 'localhost',		       MultiHomed => 1,		       Timeout => 1,		      ) or die "$!";    print $sock "ok 6\n";    sleep(1); # race condition    print $sock->getline();    $sock->close;    exit;} else {    die;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?