#!/usr/bin/perl -w # http-echo.pl - Don Yang (uguu.org) # # ./http-echo.pl [port] # # 11/11/07 use strict; use Socket; sub ProcessRequest($) { my ($client) = @_; my ($request); # Read request binmode($client); defined(recv($client, $request, 0x10000, 0)) || die $!; # Echo request my $reply = "HTTP/1.0 200 OK\015\012" . "Content-Type: text/plain\015\012" . "Content-Length: " . length($request) . "\015\012" . "Connection: close\015\012\015\012" . $request; send($client, $reply, 0) || die $!; shutdown($client, 2); close($client); exit(0); } sub RunServer($) { my ($port) = @_; # Create socket my ($server, $rin, $rout); die $! unless( socket($server, PF_INET, SOCK_STREAM, getprotobyname("tcp")) && bind($server, sockaddr_in($port, INADDR_ANY)) && listen($server, 5) && binmode($server)); # Start server loop print "listening on port $port\n"; $SIG{'CHLD'} = "IGNORE"; $rin = ""; vec($rin, fileno($server), 1) = 1; while( select($rout = $rin, undef, undef, undef) ) { if( vec($rout, fileno($server), 1) ) { # Process connection my ($client, $i, $j); $j = accept($client, $server); ($j, $i) = sockaddr_in($j); $i = inet_ntoa($i); if( fork ) { close($client); } else { print "request from $i:$j\n"; ProcessRequest($client); } } } die $!; } RunServer($#ARGV == 0 ? $ARGV[0] : 80);