[Omaha.pm] Echo server on 7 IPs in < 40 lines of code

Jay Hannah jay at jays.net
Wed Nov 23 12:13:20 PST 2005


Project: You're trying to test some load balancing architecture. You 
need a program that will listen to port 443 on 7 different IPs 
simultaneously. It should accept multiple simultaneous TCP connections. 
For each connection it should echo the fist line of input back to the 
client and then disconnect (like the world's stupidest web server).

Note: IO::Multiplex rules.

Solution:
-----------
use IO::Socket;
use IO::Multiplex;

my $mux  = new IO::Multiplex;

for (153..159) {
    # Create a listening socket
    my $sock = new IO::Socket::INET(
       Proto     => 'tcp',
       LocalPort => 443,
       LocalAddr => "10.0.37.$_",
       Listen    => 4
    ) or die "socket: $@";

    # We use the listen method instead of the add method.
    $mux->listen($sock);
}

$mux->set_callback_object(__PACKAGE__);
$mux->loop;

sub mux_input {
    my $package = shift;
    my $mux     = shift;
    my $fh      = shift;
    my $input   = shift;

    $fh->send("$$input\n");
    $$input = undef;
    $mux->shutdown($fh, 1);
    $mux->shutdown($fh, 0);
    $mux->shutdown($fh, 2);
    $mux->kill_output($fh);
    $mux->close($fh);
}
-----------

Run it (as root) and poof!:

# lsof -n -i:443
COMMAND   PID USER   FD   TYPE DEVICE SIZE NODE NAME
perl    11508 root    3u  IPv4  29046       TCP 10.0.37.153:https 
(LISTEN)
perl    11508 root    4u  IPv4  29047       TCP 10.0.37.154:https 
(LISTEN)
perl    11508 root    5u  IPv4  29048       TCP 10.0.37.155:https 
(LISTEN)
perl    11508 root    6u  IPv4  29049       TCP 10.0.37.156:https 
(LISTEN)
perl    11508 root    7u  IPv4  29050       TCP 10.0.37.157:https 
(LISTEN)
perl    11508 root    8u  IPv4  29051       TCP 10.0.37.158:https 
(LISTEN)
perl    11508 root    9u  IPv4  29052       TCP 10.0.37.159:https 
(LISTEN)

Mwoo haha ahah aha,

j



More information about the Omaha-pm mailing list