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