Ejercicio 3 (30 minutos) 3 puntos Realizar un programa - ELAI-UPM

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