Una de las tecnicas mas cool, es desarrollar un servidor basado en 2 clases:
- Servidor (server)
- Gestor de cliente individual (client)
La clase server escucha por un puerto, le llega una conexion, y lo que hace es crear una nueva instancia de la clase client pasandole el nuevo socket (por referencia).
El servidor almacena este cliente conectado en una hashtable (ip, clase) y vuelve a escuchar por el puerto. Esto es necesario para conocer los clientes conectados. Obviamente, cuando un cliente desconecte, será eliminado de la hashtable.
Por su parte, el constructor de la clase client, se guarda el socket pasado por referencia, y arranca un subproceso separado para la recepcion de datos. La clase tambien tiene una funcion publica para enviar datos.
No conozco perl, pero yo tengo implementado el servidor asi, y queda muy muy bien.
Para saber si se han recibido datos o el cliente ha desconectado, lo mas normal es usar eventos, cazados tanto por el servidor como por la aplicacion que haga uso de el.
Espero que esto te ayude. Si quieres, el martes puedo postear el codigo del server que tengo hecho en C#, a ver si te sirve de ayuda.