Ingeniería del Software. Sept 08 Nombre: Nº de matrícula: Ejercicio 1 (20 minutos) 2.5 puntos Se pide realizar un sistema en C/C++ y POSIX para el tratamiento matemático de números naturales. El sistema estará compuesto por dos aplicaciones o programas independientes. El primero de ellos pide repetidamente un número natural al usuario y realiza una costosa operación matemática con dicho número. El resultado es enviado a la otra aplicación mediante una tubería, para que la segunda aplicación lo muestre por pantalla. Para no bloquear al usuario mientras se realiza el procesamiento matemático, se debe lanzar un hilo por cada número natural tecleado. Dentro de dicho hilo se realizara el procesamiento y se enviara el resultado por la tubería, que permanecerá abierta durante toda la ejecución del programa. NOTA: El procesamiento matemático consiste en una función de prototipo: int Procesa(int numero); Se pide el código completo de la aplicación que solicita los datos, los procesa y los envia por la tuberia. Ingeniería del Software. Sept 08 Nombre: Nº de matrícula: #include <pthread.h> #include <stdio.h> int fifo; void* hilo(void* d) { int numero=*((int*)d); numero=Procesa(numero); write(fifo,&numero,sizeof(int)); } void main() { pthread_t thid; mkfifo("/home/user/MiFifo1",0777); fifo=open("/home/user/MiFifo1",O_WRONLY); do { int numero; printf("Teclee numero: “); scanf(“%d”,&numero); pthread_create(&thid,NULL,hilo,(void*) &numero); } while(numero>0); close(fifo); unlink("/home/user/MiFifo1"); } Ingeniería del Software. Sept 08 Nombre: Nº de matrícula: Ejercicio 2 (20 minutos) 2.0 puntos Se desea hacer un servidor C/C++ que controla un motor en un sistema distribuido mediante sockets POSIX. Dicho servidor escuchara peticiones en su tarjeta de red con IP 192.168.1.1 y en el puerto 12345. Permitirá conectarse a un único cliente simultáneamente y queda a la espera que el cliente le envíe mensajes. Mientras el cliente este conectado y envíe mensajes, seguirá atendiendo todos los mensajes de dicho cliente. Si el cliente envía la cadena “Enciende”, el motor se pone en marcha, y si envía “Para” el motor se para. En cualquiera de los dos casos, el cliente recibe como respuesta la velocidad del motor expresada en rev/s. No es necesaria ninguna gestión de errores, exceptuando la desconexión del cliente. Cuando se desconecta un cliente, el servidor para el motor y queda a la espera de una nueva conexión. Supóngase que se dispone de las siguientes funciones que controlan el motor: void MotorON(); void MotorOFF(); float MotorGetRevs(); Ingeniería del Software. Sept 08 Nombre: Nº de matrícula: #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> void main() { struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr("192.168.1.1"); server_address.sin_port = htons(12345); int server = socket(AF_INET, SOCK_STREAM, 0); int len = sizeof(server_address); bind(server,(struct sockaddr *) &server_address,len); listen(server,5); struct sockaddr_in client_address; unsigned int leng = sizeof(client_address); while(1) { int conn = accept(server,(struct sockaddr *)&client_address, &leng); char buffer[100], respuesta[100] while(1) { if(-1==recv(conn,buffer,100,0)) break; if(!strcmp(buffer,"Enciende")) MotorON(); if(!strcmp(buffer,"Para")) MotorOFF(); sprintf(respuesta,”%f”,MotorGetRevs()); send(conn, respuesta,strlen(respuesta)+1,0); } shutdown(conn,SHUT_RDWR); close(conn); } }