El problema está en que, al recibir un carácter de fin de línea, recv regresa para que el programa procese la línea recién recibida.
Es más cómodo usar el operador diamante:
Using perl Syntax Highlighting
#!/usr/bin/perl
use IO::Socket::INET;
# auto-flush on socket
$| = 1;
my $port = 232;
# creating a listening socket
my $socket = new IO::Socket::INET(
LocalHost => 'localhost',
LocalPort => $port,
Proto => 'tcp',
Listen => 1,
Reuse => 1
);
die "No se puede crear el socket $!\n" unless $socket;
print "El servidor a la espera de conexión en el puerto $port\n";
while (1) {
# waiting for a new client connection
my $client_socket = $socket->accept();
# get information about a newly connected client
my $client_address = $client_socket->peerhost();
my $client_port = $client_socket->peerport();
print "Conexión desde $client_address:$client_port\n";
# read up to 1024 characters from the connected client
my $data = "";
#$client_socket->recv( $data, 1024 );
while (<$client_socket>) {
$data .= $_;
}
print "Datos recibidos: $data\n";
# write response data to the connected client
# $data = "ok";
# $client_socket->send($data);
# notify client that response has been sent
# $client_socket->shutdown( 1 );
}
$socket->close();
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
(sacado de
aquí, parte del famoso artículo de
programación en red en Perl)
Ahora bien, se puede hacer de varias formas. En el ejemplo que te he puesto, ves que vamos acumulando los datos que recibimos, hasta que el cliente *cierra* la conexión, y esa es la razón por la cual están comentadas las líneas que siguen, porque ya no tiene sentido enviar información a ese cliente.
Otra opción es la que se ve en los ejemplos enlazados: hay un bucle while() que va procesando cada línea, y responde al cliente según lo que haya enviado.
En cuanto a tu caso, tienes la ventaja de saber el tamaño del cuerpo del mensaje. Al leer esa línea, puedes tomar nota de esa cantidad, y al terminar la cabecera, después de la línea en blanco que sabes que separa el cuerpo, comenzar a leer esa cifra, en otro bucle, en donde vas reduciendo la cifra a medida de que vayas recibiendo datos. Algo así:
Using perl Syntax Highlighting
my $longitud = $content_length; # cifra sacada de la cabecera
my $datos; # acumulador
while ($longitud > 0) { # mientras tengamos cosas que leer
$client_socket->recv( $data, $longitud);
$datos .= $data;
$longitud = $content_length - length $datos;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4