Ejercicio 3 (30 minutos) 3 puntos Realizar un programa que actue de servidor remoto de 10 datos de tipo float que se suponen adquiridos de 10 sensores. - El programa constara de 3 hilos: o Un hilo secundario abrira un socket servidor que permitira la conexión de un unico cliente cada vez. Cuando dicho cliente se conecte le enviara constante y repetidamente cada 100 ms la informacion de los 10 sensores. Si el cliente se desconecta, el socket vuelve a quedar a la espera de conexión de un nuevo cliente. o El segundo hilo secundario realiza la adquisición de los datos de los sensores tan rapido como puede. Esta adquisición se simulara mediante un hipotetica funcion float ValorSensor(int i); que devuelve el valor leido del sensor numero i, desde el 1 hasta el 10 o El hilo principal muestra cada segundo cuantas veces se han capturado las medidas de los sensores por segundo, asi como si el cliente esta conectado o no Realizadas 145 medidas, cliente no conectado Realizadas 231 medidas, cliente no conectado Realizadas 212 medidas, cliente conectado Nota: Los datos enviados por el socket deben corresponder a un unico instante de tiempo o lectura de los mismos. Utilizar para ello los mecanismos de sincronizacion adecuados. Se puede utilizar si se desea la siguiente clase: class Socket { public: Socket(); virtual ~Socket(); int Connect(char ip[],int port); //Conectar un cliente //Inicializar un servidor (encapsula la creacion del socket, el bind y el //listen int InitServer(char ip[],int port); Socket Accept(); //encapsula el accept(), y es bloqueante void Close(); int Send(char cad[],int length); //devuelve -1 en caso de error int Receive(char cad[],int length);//devuelve -1 en caso de error private: int sock; }; SOLUCION #include “Socket.h” float datos[10]; int fd[0];//tuberia para sincronizar int conectado=0; int num_medidas=0; float ValorSensor(int i){return 2.0f*i;} void* ActualizaDatos(void* d) { int i; char testigo; float dat[10];//array local while(1) { for(i=0;i<10;i++) dat[i]=ValorSensor(i); read(fd[0],&testigo,1); memcpy(datos,dat,sizeof(datos)); write(fd[1],&testigo,1); } } void* EnviaDatos(void* d) { Socket server; server.InitServer(“IP”,12000); unsigned char testigo; while(1) { Socket com=server.Accept(); conectado=1; while(1) { read(fd[0],&testigo,1); if(0>=com.Receive(&datos, sizeof(datos))) break; write(fd[1],&testigo,1); } conectado=0; com.Close() } server.Close(); } int main() { pthread_t t1,t2; pipe(fd); write(fd[1],&testigo,1); pthread_create(&t1,NULL,ActualizaDatos,NULL); pthread_create(&t2,NULL,EnviaDatos,NULL); while(1) { sleep(1); if(conectado==1) printf("Realizadas %d medidas, conectado\n",num_medidas); else printf("Realizadas %d medidas, no conectado\n",num_medidas); num_medidas=0; } pthread_join(t1,NULL); pthread_join(t2,NULL); close(fd[0]); close(fd[1]); return 1; }