RastaCat escribiste:En primer lugar, informar que ya me funciona el servidor-cliente, y ya envía un mensaje al servidor, pero se cierra automáticamente. He hecho algunas pruebas más, y al intentar enviar un mensaje desde el servidor, los dos se quedan bloqueados (enviar mensaje tanto cliente como servidor...). He pensado en incorporar hilos en mi código, para que sea una ejecución independiente tanto como para recibir mensajes como para enviarlos.
A ver... si se trata de una serie de intercambios de información entre cliente y servidor, si los dos conocen el protocolo, no deberían bloquearse. El bloqueo es porque el que espera información, está esperando más de la que le envía el otro.
Repasa la lista de códigos de ejemplo que hay en el artículo enlazado: hay varias combinaciones de cliente/servidor, desde aquellos que solo se intercambian una línea de información, hasta la más compleja usando hilos.
En concreto, el listado 1 es el de un servidor que queda esperando la entrada de clientes, y cuando se conecta uno, le envía una línea, y cierra, esperando al siguiente cliente. El listado 2 es el cliente que acompaña ese tipo de servidor. Pero a partir de ahí, salta a usar el IO::Socket, porque es más cómodo (los programas se hacen más cortos).
RastaCat escribiste:Tengo una duda al obtener el nombre del host. Es curioso porque sólo me detecta el nombre del host si pongo el loopback (127.0.0.1), y no la IP privada de mi red (192.168...). ¿Esto es porque debo modificar el archivo hosts de mi ordenador y añadir esa IP? Si es así, ¿deberé añadir todas las direcciones IP, de los ordenadores que quiero que se quieran conectar a mi server con su IP pública?
Es el sistema operativo el que se encarga de hacer ese tipo de traducciones. El archivo /etc/nsswitch.conf es el que indica el orden de quién hace la traducción. Por ejemplo, en uno de mis servidores pone:
Using text Syntax Highlighting
hosts: files dns
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Eso quiere decir que a la hora de conocer la IP de una máquina a partir de su nombre, primero mirará en el archivo /etc/hosts, y si de ahí no saca nada, preguntará al servidor DNS.
Sí que te resuelve el localhost porque estará definido en /etc/hosts.
En el programa, es la llamada inet_aton() la que solicita al sistema operativo la traducción de un nombre a dirección IP (cuatro bytes empaquetados). Si no es capaz de hacerlo, devuelve undef.
A mí sí que me funciona con las direcciones IP:
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.10;
use Socket;
my $iaddr = inet_aton("192.168.1.1");
say unpack "N", $iaddr; # 3232235777
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Algo estará mal en el programa, que no lo haga de esta manera...