#!/usr/bin/perl
#use IO::Socket::INET;
use IO::Socket;
use IO::Select;
$SIG{PIPE} = 'IGNORE';
# use URI::Escape; # you'll need this later i guess ...
$verb = 5; # verbosity for console messages
$main = new IO::Socket::INET ( #LocalHost => 'stray.ch',
LocalPort => 4444,
Listen => 5,
Proto => 'tcp',
Reuse => 1 ) || die $!;
$zero = chr(0);
$/ = $zero;
$\ = $zero;
$| = 1;
# Initialise IO::Select ------------------------------------------------
$handles = new IO::Select();
$handles->add($main);
print "Starting listening cycle\n" if ($verb > 1);
LISTEN: while (1) {
($pending) = IO::Select->select($handles, undef, undef, 60);
foreach $sock (@$pending) {
if ($sock == $main) {
$num++;
print "Got new connection: $num from ".$sock->sockhost()."\n" if ($verb > 2);
my $newsock = $sock->accept();
$newsock->autoflush();
$number{$newsock} = $num;
$x{$newsock} = 100;
$y{$newsock} = 100;
$color{$newsock} = int(rand(20));
$handles->add($newsock);
foreach $client ($handles->handles) {
print $client qq||;
print $newsock qq||;
}
} else {
my $buf = <$sock>;
if ($buf) {
print "Existing socket $number{$sock} is pending: " if ($verb > 3);
chomp $buf;
print "$buf\n" if ($verb > 3);
($x{$sock}) = $buf =~ /x="(.*?)"/;
($y{$sock}) = $buf =~ /y="(.*?)"/;
foreach $client ($handles->handles) {
print $client qq||;
}
} else {
print "Socket $number{$sock} is gone.\n" if ($verb > 2);
$handles->remove($sock);
foreach $client ($handles->handles) {
print $client qq||;
}
}
}
}
}