La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Servidor de Batalla Naval.

Presentaciones similares


Presentación del tema: "Servidor de Batalla Naval."— Transcripción de la presentación:

1 Servidor de Batalla Naval.
Computación II. Servidor de Batalla Naval. Geronimo Manso.

2 Temas a Tratar: Objetivos. Arquitectura. Estructura.
Sockets y detalles. Hilos. Semáforos. Programa Servidor. Programa Cliente. Demo. Gerónimo Manso.

3 Objetivos: Aplicación de conceptos tales como:
Sockets. Hilos. Semáforos. Se parte de lo conocido hacia los nuevos conceptos, con el fin de centrarse en lo aprendido. Código conocido Nuevos conceptos Gerónimo Manso.

4 Arquitectura: Cliente/Servidor Servidor Clientes Gerónimo Manso.

5 Estructura: El programa servidor esta compuesto por los siguientes archivos: Batalla.c Socket.c Socket_Servidor.c Servidor.c El programa cliente : Batalla.c Socket.c Socket_Cliente.c Cliente.c Gerónimo Manso.

6 Sockets: Tipos de sockets:
Se podría decir que un socket es un canal de comunicación entre dos programas que corren en dos pc diferentes o también en la misma. Tipos de sockets: Orientados a conexión: TCP No orientados a conexión: UDP Gerónimo Manso.

7 Sockets: Servidor Los pasos básicos utilizados en el servidor son:
1 – Apertura de un socket:  socket(); //Retorna un descriptor. 2 – Asociación del programa con el socket:  bind(); 3 – Indicar que se comience a atender las conexiones:  listen(); 4 – Obtener y aceptar las conexiones:  accept(); 5 – Escritura y lectura de datos:  write() y read(); Gerónimo Manso. 6 – Cierre de conexiones:  close();

8 Sockets: Cliente Los pasos utilizados en el cliente son:
1 – Apertura de un socket:  socket(); 2 – Solicitud de conexión:  connect(); 3 – Escritura y lectura de datos:  write() y read(); 4 – Cierre de conexiones:  close(); Gerónimo Manso.

9 Sockets: Servidor - Detalles
Descripción de la sunción socket(): Función socket(AF_INET, SOCK_STREAM, 0); //Retorna un descriptor. Argumentos: Primero: AF_INET (Clientes pueden estar en otros ordenadores). AF_UNIX (Cliente corre en el mismo ordenador, aunque es mas óptimo). Segundo: SOCK_STREAM (Socket orientado a conexión). SOCK_DGRAM (Socket no orientado a conexión). Tercero: Se indica el protocolo a emplear, generalmente se pone 0. Gerónimo Manso.

10 Sockets: Servidor - Detalles
Obtención del número de puerto: Obtenemos el número de servicio al que se quiere atender, mediante la función getservbyname(); que nos devuelve un puntero a una estructura del tipo servent: Descripción: struct servent Puerto; Puerto = getservbyname(“Nombre del Servicio”,”Protocolo”); /* Se encuentra en el archivo /etc/services */ En esta estructura lo que nos interesa es el campo puerto: Puerto->s_port; Gerónimo Manso.

11 Sockets: Servidor - Detalles
Descripción de la función bind(): Antes se debe declarar la siguiente estructura: struct sockaddr_in Direccion; Completar los siguientes parámetros: Direccion.sin_family = AF_INET; /* Igual que en socket()*/ Direccion.sin_port = Puerto->s_port; /* Nº de puerto*/ Direccion.sin_addr.s_addr =INADDR_ANY; /* Direccion del cliente. Cualquiera en este caso*/ La función es: bind (Descriptor, (struct sockaddr *)&Direccion, sizeof (Direccion)); /* retorna -1 si hay error*/ Gerónimo Manso.

12 Sockets: Servidor - Detalles
Descripción de la función: listen(Descriptor, 10): /*Si hay error retorna -1*/ Argumentos: Descriptor del sockets. Número máximo de clientes en la cola. Para atender a los clientes utilizamos accept(): struct sockaddr Cliente; int Descriptor_Cliente; int Longitud_Cliente; Descriptor_Cliente = accept(Descriptor, &Cliente, &Longitud_Cliente); Descriptor del socket abierto; Puntero a una estructura sockaddr en la que obtendrá datos del cliente. Puntero a un entero, con la longitud útil del campo anterior. Gerónimo Manso.

13 Sockets: Servidor - Detalles
Descripción de las funciones: read(Descriptor, Datos, Longitud); write(Descriptor, Datos, Longitud); /*Si hay error retorna -1 y 0 si el socket se ha cerrado o llegado a su fin*/ Aclaración: Estas funciones se suelen utilizar en un lazo ya que pueden retornar sin haber escrito o leído todos los datos. Finalmente utilizamos close(); close(Descriptor_del_socket_a_cerrar); Gerónimo Manso.

14 Sockets: Cliente - Detalles
Explicaré solo las funciones que difieren del servidor. Explicación de la función conect(); Obtención del IP de servidor: struct hostent *Host; Host = gethostbyname ("Nombre_Servidor"); struct sockaddr_in Direccion; Direccion.sin_family = AF_INET; Direccion.sin_addr.s_addr = ((structin_addr*)(Host->h_addr))->s_addr; /*INADDR_ANY Pusimos en el server*/ Direccion.sin_port = Puerto->s_port; connect (Descriptor, (struct sockaddr *)&Direccion,sizeof (Direccion)) /* Retorna -1 si hay error*/ Gerónimo Manso.

15 Hilos: 1 - Para utilizar hilos incluyo el header: pthread.h
2 - Creo la función que será ejecutada en el segmento del hilo. void *hilo(void *args){ //El argumento es para pasarle información al hilo /* CODIGO DEL HILO*/ return NULL; } Gerónimo Manso. 3 - Declaro la estructura para crear al hilo: pthread_t hilo_estruc;

16 Hilos: 4 - Creo el hilo de la siguiente manera: Argumentos:
pthread_create(&hilo_struc, NULL, &hilo1, NULL); Argumentos: Puntero a la estructura del hilo. Atributos del hilo: en este caso atributos default. Puntero a la función. Para pasarle información al hilo. Gerónimo Manso.

17 Semáforos: 1 - Para utilizar semáforos incluyo el header: semaphore.h
2 - Declaro la estructura: sem_t semaforo; 3 - Inicializo el semáforo con: sem_init (&semaforo,0,1); Valor inicial del semáforo Gerónimo Manso. 0 ya que se utilizan hilos Puntero a la estructura

18 Semáforos: 4 - Para decrementar el semáforo utilizo la siguiente función: sem_wait(&semaforo); 5 - Utilizo la variable global. 6 - Para incrementar el semáforo utilizo: sem_post(&semaforo); Gerónimo Manso.

19 Computación II. Demo Fin Gerónimo Manso.


Descargar ppt "Servidor de Batalla Naval."

Presentaciones similares


Anuncios Google