Clase 6
- Threads.
- Sincronización: mutexes.
Material
Prácticas
Práctica 1: Servidor multihilo
-
Tomar el ejemplo y modificar
server_tcp.c
para que pueda aceptar múltiples conexiones. Para ello se lanzará un thread cada vez que se acepte una nueva conexión. Cada thread se encargará de recibir datos del cliente y enviar como respuesta lo mismo que recibió.Se deberá utilizar la biblioteca
clientdata.c
provista para el ejercicio, que representa un cliente que se conecta al servidor. Enclientdata.h
se define la siguiente estructura:typedef struct { int fd; pthread_t thread; int free; } clientdata;
Se deberá definir una lista (array) del tipo
clientdata
de 100 posiciones. Los campos se deberán cargar luego de aceptar la conexión, de la siguiente manera:fd
: File descriptor devuelto por la funciónaccept()
thread
: variablepthread_t
utilizada para crear el threadfree
: Entrue
para indicar que la posición del array está libre (se utilizará una lista de ítems del tipoclientdata
)
Cuando se acepta una conexión, se utilizará la función
cd_getfreeindex()
para obtener el índice de la lista del primer elemento libre (sin datos de ningún cliente). Éste se utilizará para cargar los datos y luego lanzar el thread.El thread deberá recibir como argumentos un puntero al
clientdata
, que posee en uno de sus campos el file descriptor de la conexión aceptada.La biblioteca
clientdata
también posee la funcióncd_init()
, que debe ejecutarse al comienzo del programa para inicializar la lista vacía. -
Capturar la signal
SIGINT
(ctrl+c) y finalizar todos los threads y sockets abiertos antes de finalizar el proceso.
Práctica 2: chat v3
Modificar la aplicación de chat desarrollada en las prácticas de las clases anteriores para aceptar una cantidad dinámica de clientes simultáneos, lanzando un thread por conexión.
Los clientes pueden conectarse y desconectarse en cualquier momento. Cualquier mensaje recibido de un cliente debe ser reenviado a todos los otros clientes conectados.