Ejercicio 1

Anuncio
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);
}
}
Descargar