Examen final 16-12-2002 - Universidad Tecnológica Nacional

Anuncio
Universidad Tecnológica Nacional
Técnicas Digitales III
Apellido y Nombres
Legajo
16 de Diciembre de 2002
Examen Final
Año de cursada
Profesor
Se desea implementar un sistema cliente-servidor para monitoreo de parámetros de CPU y
sistema en Linux. Se trata de un agente servidor que escucha conexiones en los puertos
UDP 40001 y subsiguientes, a razón de un numero de puerto por cada servicio. La lista de
servicios se encuentra definida en el archivo de configuración propio del server
/etc/agente.conf, a razón de una línea por cada servicio con: el nombre del servicio, el
port udp en el que se solicita el servicio, y la función a la que se debe invocar para resolver
el pedido. Los clientes inician sesión enviando un paquete de requerimiento de parámetros
de sistema: carga de procesamiento de CPU, cantidad de interrupciones por minuto,
cantidad de procesos activos, etc. Una vez establecida la sesión el servidor comienza a
enviar paquetes con la información hacia los clientes que lo solicitaron, en forma periódica a
intervalos de tiempo especificados (estos intervalos pueden ser distintos en cada cliente ya
que el valor de tiempo se indica en cada paquete de requerimiento). Cuando un cliente no
desee seguir recibiendo información enviará un paquete de petición de finalización de
requerimiento de datos.
Por cada pedido de un cliente, el servidor hará nacer un proceso hijo que se encargará de
proveer la información requerida por el mismo port por el que se solicitó el servicio.
Las funciones que resuelven los diferentes servicios están en una librería (no se bloquean y
retornan inmediatamente el valor instantáneo) y se encuentran prototipeadas en
/includes/monitor.h.
Deberá existir un servicio en el port TCP 40001 que monitorea el funcionamiento del
servidor. Al conectarse a este port, un cliente mediante un paquete de requerimiento
adecuado solicitará al servidor la cantidad total de instancias child en ejecución y la cantidad
de hijos colectores de cada tipo. Para ello el servidor debe llevar la cuenta de los procesos
hijos activos. Implemente este mecanismo de comunicación entre el padre y los procesos
child por el método que considere mas apropiado.
Se pide:
a.) Definir la estructura de los diferentes mensajes que intercambian cliente y servidor para
obtener las funcionalidades pedidas en el enunciado.
b.) Implementar el programa servidor completo (todos los servicios tcp y udp) de acuerdo a
las definiciones planteadas en la respuesta al ítem a).
c.) Implementar el programa cliente UDP y TCP.
d.) Explicar como se debe declarar y en que archivo(s) de configuración del sistema los
diferentes servicios para que sean reconocibles y accesibles.
e.) Una de las funciones de librería que se invoca se denomina numtasks, y devuelve un
int equivalente a la cantidad de tareas en ejecución en el sistema.
e.1.) Escriba la rutina en assembler que determine esa cantidad accediendo a las tablas
del sistema de manera apropiada. Debe invocarse desde el programa del ítem b.).
e.2.) Utilice las directivas necesarias para que sea accesible desde un programa externo.
e.3.) Indique las características del segmento de código en el que ejecutará esa rutina.
Universidad Tecnológica Nacional
Técnicas Digitales III
16 de Diciembre de 2002
Examen Final
Apéndice
Funciones standard de TCP / IP
int
socket (int familia, int tipo , int Protocolo);
int
bind (int sock , struct sockaddr * direccion, int tam)
int
listen (int sock, int buffer);
int
connect (int fd, struct sockaddr * direccion, int tam);
Int
accept (int fd, void * direccion, int tam);
Int
read (int fd, char array, int tam);
ssize_t
readv (int fd, const struct iovec * array, ssize_t tam);
int
recv (int fd, void *puntero, int tam, int control)
int
recvmsg (int fd, struct msghdr msg, int control)
int
recvfrom (int fd, void * puntero, int tam, int control, void *origen, int tam_origen)
ssize_t
write(int fd, const void * buf, size_t num);
ssize_t
writev (int fd, const struct iovec *array, size_t tam);
int
sendto (int fd, void *puntero, int tam, int control, void *destino, int tam_destino);
int
sendmsg (int fd, struct msghdr msg, int control);
int
send (int fd, void * puntero, int tam, int control);
int
shutdown (int fd, int control);
Funciones auxiliares
unsigned long int htonl (unsigned long int hostlong);
unsigned short int htons (unsigned short int hostlong);
unsigned long int ntohl (unsigned long int netlong);
unsigned short int ntohs (unsigned short int netlong);
int getpeername ( int sockfd, struct sockaddr *addr, int *addrlen ); /*Nos dice quien esta conectado
en el otro extremo de un socket stream.*/
sockfd: Descriptor del socket stream conectado.
addr: Puntero a una estructura sockaddr que almacenara la direccion del otro
extremo de la conexion.
addrlen: Puntero a int que contiene la longuitud de sockaddr ( sizeof (sockaddr) ).
int gethostname ( char *hostname, size_t size ); /*Retorna el nombre del sistema donde esta
ejecutandose el programa. El nombre puede ser utilizado por gethostbyname() para determinar la
direccion IP del host local. Retorna cero cuando se ejecuta con éxito.*/
hostname: Puntero a un array de caracteres que contendra el nombre del host.
size :Longitud en bytes del array hostname.
struct hostent *gethostbyname (const char name) /*Se utiliza para convertir un nombre de un host
a su direccion IP, utiliza el servidor de nombres.*/
Estructuras y variables auxiliares
struct sockaddr_in
Universidad Tecnológica Nacional
Técnicas Digitales III
16 de Diciembre de 2002
Examen Final
{
short
sin_family; /*AF_INET*/
u_short
sin_port;
/* Número de puerto */
struct in_addr
sin_addr;
/*Identificación dentro de la red y host */
char
sin_zero [8];
};
struct in_addr
{
u_long
s_addr;
};
Struct iovec
{
caddr_t
iov_base;
int
iov_len;
};
struc
{
caddr_t
int
struct iovec
int
caddr_t
int
};
/* Puntero al comienzo del espacio reservado */
/* Tamaño de memoria reservada)*/
msghdr
msg_Name;
tam_msg_Name;
*msg_iov;
tam_msg_iov;
msg_accrights;
msg_accrightslen;
struct hostent
{
char *
h_name;
char **
h_aliases;
int
h_addrtype;
int
h_length;
char**
h_addr_list;
};
/* Estructura con los datos. Ya fue vista */
/*Numero de elementos de msg_iov */
/* Flags de acceso */
/* Tamaño de msg_accrights */
/* Nombre oficial del host */
/* Array de nombres alternativos */
/* Tipo de dirección que se retorno ( AF_INET ) */
/* Array de direcciones de red para el host */
/* La primer dirección en h_addr_list */
Descargar