#!/usr/local/bin/perl
use strict;
use IO::Socket;
use IO::Select;
use URI::Escape;
my $sock_http = new IO::Socket::INET(
Listen => SOMAXCONN,
LocalPort => 80,
Proto => 'tcp',
Reuse => 1,
);
my $sock_4040 = new IO::Socket::INET(
Listen => SOMAXCONN,
LocalPort => 4040,
Proto => 'tcp',
Reuse => 1,
);
my $selector = new IO::Select();
$selector->add( $sock_http );
$selector->add( $sock_4040 );
my %list;
my @log = ();
my $html_head = <<_HTML_;
あやしいわーるど@P2P
_HTML_
my $html_form = <<_HTML_;
_HTML_
my $html_foot = <<_HTML_;
_HTML_
while ( 1 ) {
foreach my $sock ( $selector->can_read() )
{
print "Receive ", $sock->fileno, "\n";
if ( $sock == $sock_http )
{
print " new http\n";
my $new_sock = $sock_http->accept();
$selector->add( $new_sock );
$list{ $new_sock->fileno } = { type => "http" };
}
elsif ( $sock == $sock_4040 )
{
print " new 4040\n";
my $new_sock = $sock_4040->accept();
$selector->add( $sock_4040 );
$list{ $new_sock->fileno } = { type => "4040" };
}
else
{
if ( $list{ $sock->fileno }->{type} eq "http" )
{
printf" http\n";
if ( <$sock> =~ /q=([^\s\&]+)/ )
{
my $msg = uri_unescape( $1 );
print " msg $msg\n";
unshift( @log, time()."<>$msg" );
}
print $sock "HTTP/1.0 200 OK\n";
print $sock "\n";
print $sock "$html_head";
print $sock "$html_form";
foreach my $log ( @log )
{
my( $t, $msg ) = split( "<>", $log );
$msg =~ s/</g;
$msg =~ s/>/>/g;
print $sock date( $t )." $msg
\n";
}
print $sock "$html_foot";
disconnect( $sock );
}
elsif ( $list{ $sock->fileno }->{type} eq "4040" )
{
printf " 4040\n";
if ( my $buf = <$sock> )
{
print " msg $buf\n";
}
}
print "\n";
}
}
}
sub disconnect
{
my $sock = shift;
print "Dicsonnect ", $sock->fileno, "\n";
$selector->remove( $sock );
$list{ $sock->fileno } = undef;
$sock->close();
}
sub date
{
my @date = localtime( shift );
return sprintf(
"%04d/%02d/%02d %02d:%02d:%02d",
$date[5] + 1900,
$date[4] + 1,
$date[3],
$date[2],
$date[1],
$date[0],
);
}