Programa servidor:
A partir del ejemplo de cliente-servidor, realizar un programa que espere conexiones de clientes. Cada vez que un cliente se conecte al servidor, el servidor crea un nuevo thread que atenderá al cliente.
El servidor deberá tener un array de 50 posiciones de la siguiente estructura:
typedef struct { int fd; pthread_t pth; int estado; char ID[20]; } cliente_t;
- Cada vez que un cliente se conecta, se reservará el primer lugar libre del array, guardando en el campo fd el socket conectado, en pth el puntero al nuevo thread, y el estado se colocará en 1. Cuando el cliente se desconecta, el campo estado pasa a 0.
- cuando un cliente se conecta, el servidor imprime un mensaje con el número de ID del cliente conectado.
- existirá una variable global (int cantMensajes;) que se incrementará cada vez que se reciba un mensaje desde un cliente cualquiera. El thread correspondiente responderá una cadena “OKxxxx” reemplazando xxxx por el contenido de la variable cantMensajes. Tomar los recaudos para que la variable no sea accedida por dos threads a la vez.
- cada vez que se reciba un mensaje del cliente, se imprime el ID y el mensaje en pantalla.
- cuando un cliente se desconecta, se imprime en pantalla un mensaje con el ID y el thread asociado se cierra.
- Capturar SIGINT y cerrar todos los threads y sockets antes de finalizar el programa.
Programa Cliente:
Al iniciar el programa del cliente, se pedirá al usuario un string de ID, un valor entero de periodo en [ms] y un mensaje. El cliente intentará conectarse al servidor, una vez lograda la conexión enviará su ID, y luego enviará el mensaje escrito por el usuario cada intervalos fijados por el período ingresado, y esperando recibir la respuesta del servidor con la cantidad de mensajes totales hasta el momento. Se deberá imprimir en pantalla este mensaje recibido desde el servidor.