programar un chat rudimentario en c

Iniciado por pelos22, 21 Junio 2011, 20:17 PM

0 Miembros y 1 Visitante están viendo este tema.

pelos22

este es el enunciado, alguien me puede exar una mano.[color=navy][/color]
Escribe un servidor que pueda atender hasta cuatro clientes simultáneamente y que, cuando reciba
texto de cualquiera de los clientes, envíe ese mismo texto a todos los clientes conectados.
Esta forma de funcionar permite un rudimentario "chat", ya que cuando cualquiera de los usuarios
escribe algo, todos los demás lo leen, si bien no saben de quién proviene el mensaje (el usuario debería
poner su nombre como encabezado del mensaje).
Para poder implementar un servidor así, no es posible usar fork() ya que si tenemos cada servidor
en un proceso separado atendiendo cada uno a un cliente no hay forma de que desde uno de ellos se
pueda escribir en los sockets de los clientes de los otros.
Por tanto el servidor debe implementarse mediante select(). El algoritmo sería el siguiente:
El programa tiene un array de 4 enteros, para almacenar los descriptores de los sockets de datos
de los clientes a los que puede atender. Inicialmente estos enteros valen 0 para indicar que no
hay cliente conectado en ninguno de ellos.
Adicionalmente tendrá un socket de escucha, incializado y preparado para aceptar conexiones
en el número de puerto que se haya pasado al programa principal desde línea de comandos.
En un bucle infinito:
 Se preparará un conjunto fd_set con los descriptores de los sockets a observar. Éstos serán
el socket de escucha (que irá siempre), y los sockets de datos distintos de cero.
 select() deja el programa bloqueado hasta que ocurra algo en alguno de esos sockets.
 Si ha sido en el de escucha:
 Aceptar el cliente guardando el nuevo socket de datos en una variable auxiliar.
 Si hay sitio para un nuevo cliente (algún socket de datos es cero), copiar la variable
auxiliar al elemento libre del array de sockets de datos.
 Si no hay sitio para un nuevo cliente (todos los sockets de datos son distintos de
cero), cerrar de nuevo el socket auxiliar que acababa de crearse en accept(). El cliente
correspondiente verá que es aceptado momentáneamente, pero inmediatamente después
se cierra su conexión.
 Volver al bucle infinito.
 Si ha sido en alguno de los sockets de datos:
 Leer los datos de ese socket.
 Si la lectura retorna 0 bytes, es que el cliente correspondiente ha cerrado. En ese caso
cerrar ese socket de datos, poner a 0 su descriptor (para indicar que ya no tiene cliente
conectado), y volver al bucle infinito.
 Si la lectura retorna distinto de cero, escribir los datos recibidos en todos los demás
sockets de datos que tengan un cliente conectado.
 Volver al bucle infinito.

_Enko


dakomt

Y si es para Linux te recomiendo que le eches un vistazo al libro: "UNIX NETWORK PROGRAMMING" de W. Richard Stevens et al.