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 */