Я предполагаю, что ваш сценарий не для производства, а для домашней работы или тестирования. Существует несколько очень эффективных решений для веб-серверов в / с Perl, таких как Apache с CGI или mod_perl, HTTP :: Server :: Simple и PSGI / Plack .
Вы также обычно будете использовать фреймворк, такой как Dancer , Mojo или Catalyst , который делает большинство скучных стандартных вещей для вас:
use Dancer;
get '/' => sub {
return 'Hi there, you just visited host '.request->host.
' at port '.request->port.' asking for '.request->uri;
};
Возвращаясь к вашему вопросу: ваш скрипт является интерактивным сервером, а HTTP имеет строгую структуру запросов и ответов:
- Клиент подключается к серверу
- Клиент отправляет запрос
- Сервер отправляет ответ
Вам нужно удалить интерактивную часть и просто подождать, пока клиент начнет разговор:
use IO::Socket;
use Net::hostent; # for OO version of gethostbyaddr
$PORT = 9009; # pick something not in use
$server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT,
Listen => SOMAXCONN,
Reuse => 1);
die "can't setup server" unless $server;
print "[Server $0 accepting clients]\n";
while ($client = $server->accept())
{
$hostinfo = gethostbyaddr($client->peeraddr);
# Read request up to a empty line
my $request;
while ( <$client>) {
last unless /\S/;
$request .= $_;
}
# Do something with the request
# Send response
print $client "Status: 200 OK\r\nContent-type: text/plain\r\n\r\n".$request;
close $client;
print "client closed";
}
Сервер считывает полный запрос от клиента и возвращает свернутый заголовок HTTP плюс исходный запрос.