Entorno de programación de nivel 1: La librería PCAP

Documentos relacionados
Procesos e hilos: cálculo de

Procesos e Hilos en C

PARTE II PROGRAMACION CON THREADS EN C

Biblioteca de sistema

Sincronización de Threads

Programación Concurrente

Introducción a la librería de desarrollo librawnet

Concurrencia en UNIX / LINUX. Introducción: Procesos e Hilos POSIX

Sistemas Operativos 1

Informática Electrónica Concurrencia

Funciones Definición de función

Programación de Multitareas utilizando Hilos

Función monitoreo descriptor archivo #include <sys/types.h> #include<unistd.h> #include<errno.h> extern void procesamiento_datos(char *, int); void pr

Hilos (threads) Realizado por M. Curiel

Herramient tas Vi Visuales de l d Compilación en C LUIS MENGUAL (c)

Herramientas Visuales de Compilación en C. LUIS MENGUAL (c)

SISTEMAS OPERATIVOS: PROCESOS. Hilos y Procesos

Sistemas Operativos Práctica 3

T5-multithreading. Indice

Examen Teórico (1/3 de la nota final)

Prácticas de Sistemas operativos

Introducción a Sistemas Operativos: Ficheros

FUNDAMENTOS DE PROGRAMACIÓN Asignatura correspondiente al plan de estudios de la carrera de Ingeniería Informática

Herramientas Visuales de Compilación en C. LUIS MENGUAL (c)

HILOS POSIX. LABORATORIO DE SISTEMAS DE OPERACIÓN I (ci 3825) Prof. Yudith Cardinale Enero marzo 2011

Concepto de proceso. (c) 2006 Alexis Quesada / Francisco J. Santana 2

Programación I Funciones

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

BENEMERITA UNIVERSIDADD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

Lenguaje C, tercer bloque: Funciones

Apellidos: Nombre: Matrícula: Examen Programación para Sistemas Grado en Ingeniería Informática (2009)

Tema 13: Manejo de archivos en lenguaje C

Fundamentos de los Sistemas Operativos

Sistemas Operativos I Manual de prácticas

Existen diversas técnicas de agrupamiento. Se dividen en dos grandes categorías:

Caracter a caracter los datos pueden ser escritos o leidos carácter a carácter, con las funciones fputc() y fgetc().

APELLIDOS NOMBRE GRUPO CALIFICACIÓN FECHA

Programación I Teoría : Entrada/Salida - Archivos.

Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C. Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas.

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

PROBLEMA 1. Rellena el hueco 1 (línea 23). Realiza la reserva de memoria para almacenar los n puntos.

Bloque I: Principios de sistemas operativos

Analista Universitario en Sistemas. Sistemas Operativos. Instituto Politécnico Superior THREADS

Ejercicios sobre tuberías

Flujos (streams) Programación. Licenciatura Lingüística y Nuevas Tecnologias Nadjet Bouayad-Agha

Práctica 4: Desarrollo de clientes bajo TCP y UDP.

Por ejemplo, para declarar un arreglo de enteros llamado a con diez elementos se hace de la siguiente forma:

Tema 6. Gestión de ficheros en C. Programación en Lenguajes Estructurados

Introducción a Sistemas Operativos: Concurrencia

Threads. Hilos - Lightweight process - Procesos ligeros

Cursosindustriales. Curso de C / C++ Por Deimos_hack

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

LnxComm. Linux Communication. Fernando Pujaico Rivera

6. Archivos. Programación II, FCFM, BUAP

Para C un chero no es más que una porción de almacenamiento

Formatos para prácticas de laboratorio

Tema 3: Entrada/Salida de Ficheros

Práctica 1: Intérprete de mandatos. Sistemas Operativos Área de Arquitectura y Tecnología de Computadores

Informática PRÀCTICA 2 Curs

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

PROTOCOLOS PARA LA INTERCONEXIÓN DE REDES

ANÁLISIS DE UN INTERFAZ DE RED

Tema VII POO y lenguajes de programación no Orientados a Objetos (R-1.1)

Bloque I: Principios de sistemas operativos

Enunciado 2 Descifrar claves cifradas con crypt

Programación Concurrente

Archivos. Programación en C 1

Introducción a la Programación

Concepto Concept s Los L nom res re d e e los h c eros: exter te n r os o o fí s fí ico nom re ú nico i del del ar chiv chiv o o o ficher ficher en

Procesos ligeros. Arquitectura de Computadores II Universidad Carlos III de Madrid

Diseño de tipos Igualdad, representación, código, copia y relación de orden

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

/* Compilador del Lenguaje Micro (Fischer) */ #include <stdio.h> #include <string.h> #include <ctype.h>

1. Procesos vs Hilos 2. Cuando se ejecutan los procesos 3. Fork 4. Clone 5. Cómo se ejucuta el fork? 6. do_fork() 7. copy_process 8.

ESTRUCTURAS. Struct Identificador_ tipo_estructura { Tipo miembro_1; /*Declaración de los miembros*/

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

UNIVERSIDAD CARLOS III DE MADRID AREA DE ARQUITECTURA Y TECNOLOGÍA DE COMPUTADORES GRADO EN INGENIERÍA INFORMÁTICA. SISTEMAS DISTRIBUIDOS

Bloque III. Herramientas

LEER RECUPERAR EXTRAER DATOS DE FICHEROS O ARCHIVOS EN C. FGETC, GETC, FGETS, FSCANF. EJERCICIOS (CU00538F)

Message Passing Interface (MPI)

Plataformas de Tiempo Real

TEMA 8. Ficheros. 1. Introducción

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Informática I Threads

Tema 5 Tabla de Símbolos

Recursión como herramienta en resolución de problemas computacionales

U.A.B.C. Facultad de Ingeniería Programación Estructurada UNIDAD III

Una función es un miniprograma dentro de un programa. Las funciones contienen varias

SISTEMAS OPERATIVOS: COMUNICACIÓN Y SINCRONIZACIÓN ENTRE PROCESOS. Desarrollo de servidores concurrentes

Programación Concurrente

Resolución problema Bitbloq online con MAX 8

Plataformas de Tiempo Real

Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo

Introducción a C++ y Code::Blocks

Transcripción:

Entorno de programación de nivel 1: La librería PCAP La librería libpcap nos permite capturar paquetes desde un programa C. En sistemas Windows, la librería se llama Winpcap. Para compilar cualquier programa que haga uso de la librería libpcap necesitamos incluir el fichero de cabecera pcap.h en las fuentes (#include <pcap.h>) y añadir en la cadena de compilación la orden lpcap. También se puede usar el makefile junto con el resto de archivos de cabecera y librería que se ha colgado en el Moodle de la asignatura. Para instalarla la librería en un sistema basado en Debian (Ubuntu por ejemplo) se puede ejecutar: sudo apt_get install libpcap_dev Veamos primero las funciones básicas que nos permite la libpcap: Capturar de un interfaz Para abrir un interfaz para captura: pcap_t *pcap_open_live(const char *device, int snaplen,int promisc, int to_ms, char *errbuf); Device: es el nombre de la interfaz que se quiere abrir (eth0, eth1...). snaplen: es la cantidad de bytes que se quieren guardar por cada paquete. Es útil cuando no nos interesa la carga útil del paquete y así reduciríamos el tamaño de la captura. Por defecto usaremos el valor 1514 (MTU Ethernet). promisc: indica si queremos abrirla en modo promiscuo (promisc=1) o no (promisc=0). to_ms duración del timeout de lectura. Tiempo que se espera para leer varios paquetes en una misma transacción. En errbuf se guarda el mensaje de error, si procede. La función nos devuelve el puntero al descriptor de fichero pcap. Este descriptor es necesario cuando vayamos a realizar alguna operación sobre el tráfico. Por ejemplo leer un paquete. A efectos prácticos esta estructura es similar a un FILE * Hay que recordar que para abrir una interfaz es necesario tener permisos de superusuario. Ejemplo: p=pcap_open_live( eth0,0,1, 100, errbuf); Abre para la interfaz eth0 en modo promiscuo, capturando el paquete en su totalidad, con un timeout de lectura de 100 ms. En caso de error, guarda el mensaje en la cadena errbuf. En esta práctica no se realizarán capturas sobre interfaces.

Recibir tramas: Para la recepción de tramas vamos a utilizar la función: int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user); p: es un puntero a una estructura pcap_t previamente rellena por la función pcap_open_live. callback: función que será ejecutada cada vez se reciba una trama. Esta función es la función de notificación de nivel 1. Esta función tiene la siguiente interfaz: o typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes); user: información a nivel de usuario que se desea pasar cada vez que se reciba una trama. Si no se desea pasar nada se debe rellenar con NULL. Ejemplo: void attendpacket(u_char *user,const struct pcap_pkthdr *h,const u_char *packet) printf( Paquete recibido\n ); Int main(int argc,char *argv[]) if((p=pcap_open_live("eth0",1514,1,timeout, errbuff))==null) return -1; pcap_loop(p,-1,attendpacket,null); pcap_close(p); ATENCIÓN: La función pcap_loop es bloqueante, es decir, una vez llamemos a la función no se ejecutará el código que está a continuación antes que no salgamos del loop de captura. Para salir del loop de captura se debe utilizar la función pcap_breakloop.

void pcap_breakloop(pcap_t *p); p: descriptor pcap que se está utilizando para la captura. La función pcap_breakloop debe ser llamada en la función FinalizarNivel1a. Enviar paquetes: Para el envío de tramas Ethernet vamos a usar la función: int pcap_sendpacket(pcap_t *p, const u_char *buf, int size); p: es un puntero a una estructura pcap_t previamente rellena por la función pcap_open_live. buf: Buffer donde está almacenado el paquete que se desea enviar. size: Tamaño del paquete a enviar. La función devuelve el número de bytes que han sido correctamente enviados. Cerrar Captura: Las capturas abiertas con pcap_open_live, se cierran con pcap_close. void pcap_close(pcap_t *p); p es el fichero a cerrar

Uso de hilos: La función pcap_loop debe ser llamada en IniciarNivel1a. Para evitar el bloqueo en la función de inicialización se propone hacer uso de hilos. Los hilos permiten ejecutar tareas concurrentemente en el S.O. Para lanzar un hilo se utiliza la función: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); thread: estructura de hilo que será rellena por la función pthread_create. Esta estructura se usará posteriormente para comprobar la finalización del hilo. Attr: atributos de ejecución del hilo. En nuestro caso pasaremos NULL para utilizar los atributos por defecto. Start_routine: puntero a función que se ejecutará en el nuevo hilo que se cree. Esta función debe tener el siguiente prototipo: o void * threadfunction(void *args) arg: conjunto de argumentos que serán pasados a la función anterior (start_routine) como primer argumento. En nuestro caso no hará falta usar este valor y se puede pasar a NULL. Es importante entender el concepto que hay detrás de los hilos. Cuando se llama a la función pthread_create se crean 2 flujos de ejecución en paralelo. El primero continúa con el programa principal ejecutando las instrucciones posteriores a pthread_create. El segundo ejecutará en paralelo la función pasada como segundo argumento. Una vez que dicha función retorna, se considera que el hilo ha terminado. Para comprobar que el hilo ha acabado se usa la función: int pthread_join(pthread_t t,void **retval); t:identificador de hilo del cual queremos comprobar su finalización. retval: valor de retorno de la función pasada como segundo argumento a pthread_create. En nuestro caso este valor será NULL ya que la función de hilo no debe devolver nada.

Ejemplo: void * startcapture(void *arg) printf( Esto es el hilo y se ejecuta en paralelo\n ); pthread_t tid; int main(int argc,char *argv[]) printf( iniciamos el programa y vamos a crear un hilo\n ); pthread_create(&tid,null,startcapture,null); printf( Esto es el main\n ); pthread_join(tid,null); return 0; Para utilizar hilos en un programa en C se debe hacer un include de pthread.h y compilar utilizando la opción lpthread. Cómo funciona la recepción de un paquete en el nivel1a? A continuación se presenta un gráfico de llamadas que representa las funciones que se llaman cada vez que se recibe un paquete. Función de callback de nivel Superior Función de callback. AttendPacket Nueva trama pcap_loop

NOTA FINAL: La comunicación entre la parte emisora y la parte receptora de un programa debe realizarse a través de variables globales. Estas variables globales deben ser protegidas con semáforos (pthread_mutex) si van a ser accedidas concurrentemente. Hay que tener en cuenta que la parte receptora y la emisora ejecutarán en paralelo generalmente ya que llamaremos a la función pcap_loop dentro de un nuevo hilo.