Article View: es.comp.os.linux.programacion
Article #14385Re: Sockets y multiples conexiones.
From: Raúl (Ridiculum)
Date: Wed, 08 Nov 2000 00:00
Date: Wed, 08 Nov 2000 00:00
87 lines
3950 bytes
3950 bytes
El Tue, 7 Nov 2000 22:36:09 +0100, Santiago Romero escribi�:
>
> Enas...
> tengo en mente hacer unas cosillas de redes (en realidad yo de lo
> que s� es de programar juegos ;) y para ponerme a mirar si mi
> "proyecto" es o no viable necesito desarrollar un programilla de
> ejemplo que se quede escuchando un puerto y que admita m�ltiples
> conexiones.
>
> Como ejemplo para probar esto y practicar con sockets lo que he
> pensado es hacer un programa que escuche en un puerto y acepte
> multiples conexiones, permitiendo a la gente escribir en el
> canal (una especie de cutre-irc sin opciones).
>
> Bien, yo de sockets s� lo justo, de hecho los uso en mi POPMAIL
> para abrir un socket que se conecta a un servidor POP y env�a
> comandos POP3, as� que la parte del cliente supongo que ser�
> sencillita. El problema es la parte del server: no s� como hacer
> que un programa se quede en el puerto por ej 1323 y acepte todas
> las conexiones entrantes. �tengo que hacer un vector para las
> conexiones y recorrerlo con un bucle? �usar el fork ese (que no
> s� usar) para duplicar el programa? :?
>
> En fin, como A. Gutierrez anda por aqui, planteo mi pregunta en
> busca de ayuda ;)
Bueno, te voy a responder lo que acabo de leer hace dos o tres d�as en
un libro, asi que no seais crueles con mi explicaci�n:
Lo que tienes que usar es fork. Con esto creas otro proceso (proceso
hijo) indentico al original (proceso padre).
El proceso que realmente atiede la peticion es el hijo, mientras el
padre se queda escuchando en el puerto original para estar al loro de
otras posibles peticiones de conexion.
Te voy a copiar un texto sacado del libro "Unix. Programacion Avanzada"
de la editorial Ra-ma. Autor Fco Manuel Marquez:
"Esquema generico de un servidor y de un cliente.
Las acciones que debe llevar a cabo el programa servidor son las
siguiente:
1.-Abrir el canal de comunicaciones e informar a la red tanto de la
direccion a la que respondera como de su disposicion para aceptar
peticiones de servicio
2.-Esperar a que un cliente le pida servicioen la direccion que el
tiene declarada
3,.Cuando recibe una peticion de servicio, si es un servidor
interactivo, atendera al cliente. Los servidores interactivos se suelen
implementar cuando la respuesta que necesita el cliente es sencilla e
implica poco tiempo de proceso.
Si el servidor es concurrete, creara un proceso mediante fork para que
le de servicio al cliente.
4.-Volver al punto 2."
Codigo ejemplo:
"...
if ((pid=fork())==-1)
/*ERROR. no se ha podido crear el proceso hijo, no se podra
* entender la peticion*/
else if (pid==0) /*tenemos el proceso hijo en marcha.*/
{
/*aqui llamamos a las funciones que atender�n la petici�n*/
exit(0); /*terminamos la ejecucion del proceso hijo*/
}
/*codigo del proceso padre*/
mirate el man de fork y de listen
Buscan en Google por unix programming o linux programming, te saldr�n
buenas cosas. Ve a la pagina de Juanjo y coge el manual de sockets de
"Beej".
Mirate algun servidor sencillito, y podras ver como atienden varias
peticiones a la vez.
> salu2!
>--
--
Miembro del grupo LILO: http://lilo.sourceforge.net
Linux User 157744
Red Hat 6.0 (2.2.16)
ridiculum at unix-shells . com
Technical Details
Message-ID:
<slrn90jmuc.ec.Ridiculum@localname.localdomain>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<9ks9u8.jc.ln@127.0.0.1>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,8bfdad65296f88d X-Google-Attributes: gidf86c8,public From: Ridiculum@bionichat.com (Raúl (Ridiculum)) Subject: Re: Sockets y multiples conexiones. Date: 2000/11/08 Message-ID: <slrn90jmuc.ec.Ridiculum@localname.localdomain> X-Deja-AN: 691708733 Content-Transfer-Encoding: 8bit References: <9ks9u8.jc.ln@127.0.0.1> Organization: Alcatraz de Janes Content-Type: text/plain; charset=iso-8859-1 User-Agent: slrn/0.9.6.2 (Linux) Mime-Version: 1.0 Newsgroups: es.comp.os.linux.programacion