Tema 4 El paradigma cliente-servidor



Documentos relacionados
Arquitecturas cliente/servidor

ARQUITECTURAS CLIENTE/SERVIDOR

La vida en un mundo centrado en la red

Cliente/Servidor en Java

Modelo de Objetos Distribuidos

Comunicación entre procesos

Introducción a las Redes de Computadoras. Obligatorio

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. CAPÍTULO 8: El nivel de transporte en Internet

FUNDAMENTOS DE REDES CONCEPTOS DE LA CAPA DE APLICACIÓN

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN

Curso de Redes Computadores 1 Tema 3 Introducción a la capa de transporte. Interfaz de programación en redes. Sockets.

Cátedra de Sistemas Distribuidos Escuela de Ingeniería Electrónica Departamento de Sistemas e Informática

Clase 22 Nivel de Aplicación WWW Tema 6.- Nivel de aplicación en Internet

1. Definición de puerto 2. Sockets 3. Conceptos cliente/servidor 4. Definición de Stream 5. Concurrencia, multiprogramación y multitarea 6.

La interoperabilidad se consigue mediante la adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

PROGRAMACIÓN ORIENTADA A OBJETOS Master de Computación. II MODELOS y HERRAMIENTAS UML. II.2 UML: Modelado de casos de uso

Tema 4. II - Cookies. Arquitecturas Distribuidas 11/12

Práctica 1. Uso básico de servicios cliente-servidor

Los mayores cambios se dieron en las décadas de los setenta, atribuidos principalmente a dos causas:

GUÍA Nro. 1 TECNOLOGÍA DE INTERNET. TIII PIII

Nivel aplicación Interacción Cliente Servidor. ELO322: Redes de Computadores Agustín J. González

Fundamentos del diseño 3ª edición (2002)

Capas del Modelo ISO/OSI

INTRODUCCION. Tema: Protocolo de la Capa de aplicación. FTP HTTP. Autor: Julio Cesar Morejon Rios

Sistemas Operativos Práctica 3

Capa de TRANSPORTE. Ing. José Martín Calixto Cely Original: Galo Valencia P.

Tema 1. Conceptos fundamentales de los Sistemas Operativos

Paradigma cliente-servidor

Índice general. Tipos de servicio de transporte. Por qué un nivel de transporte? TEMA 6 Funciones de los niveles superiores. Miguel A.

Práctica 3 de Redes de Área Local Cliente y Servidor de ficheros concurrente

ARQUITECTURA DE DISTRIBUCIÓN DE DATOS

Sistemas de Información Introducción a los Sistemas de Información: El Modelo Cliente/Servidor

Introducción a la programación con sockets en C

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

Paradigma cliente-servidor

Capítulo 5. Cliente-Servidor.

Tema 1. Arquitectura Cliente/Servidor

GLOSARIO. Arquitectura: Funcionamiento, estructura y diseño de una plataforma de desarrollo.

Capa de Aplicación (Parte 2 de 2)

Tema 4.1: - TRANSPORTE-

DHCP. Dynamic Host Configuration Protocol. Protocolo de Configuración Dinámica de Host. Administración de Redes de Computadores

Instituto Tecnológico de Costa Rica Escuela de Ingeniería Electrónica. Analizador de protocolos

Integración de Laboratorios Remotos en emersion

Examen escrito de Programación 1

SERVIDOR WEB PARA ACCESO EN TIEMPO REAL A INFORMACIÓN METEOROLÓGICA DISTRIBUIDA

Unidad 1: Conceptos generales de Sistemas Operativos.

El software desarrollado ha sido dividido en tres módulos: el monitoreador del tráfico, la Interfase con el usuario y la base de datos.

Proceso Unificado de Rational PROCESO UNIFICADO DE RATIONAL (RUP) El proceso de desarrollo de software tiene cuatro roles importantes:

Federico Peinado

Modelado Avanzado con Casos de Uso. Diseño de Software Avanzado Departamento de Informática

6.4 ESTRATEGIAS DE PRUEBA

Introducción a Internet

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

HTTP Introducción. Redes de Datos Ing. Marcelo Utard / Ing. Pablo Ronco FACULTAD DE INGENIERIA UNIVERSIDAD DE BUENOS AIRES

URL. Después de los dos puntos: se interpreta según el método de acceso. Suele contener direcciones y puntos de acceso en una máquina. Esquema URL.

CFGM. Servicios en red. Unidad 2. El servicio DHCP. 2º SMR Servicios en Red

Sockets en Java. La Creatividad proviene de un conflicto de ideas. Uso de Sockets

Estructuras de Sistemas Operativos

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

Infraestructura Tecnológica. Sesión 5: Arquitectura cliente-servidor

Una ACL es una lista secuencial de sentencias de permiso o denegación que se aplican a direcciones IP o protocolos de capa superior.

SISTEMAS DE INFORMACIÓN II TEORÍA

INGENIERÍA DEL SOFTWARE I Práctica 4 Interacciones

Introducción a la programación orientada a objetos

Problemas de Redes de Computadores. Conjunto de problemas 1

Lab 01: Programación de Sockets en TCP

Sumario... 5 Prólogo Unidad didáctica 1. Introducción a la computación distribuida Objetivos de la Unidad... 12

INFORMÁTICA IE. Términos a conocer y conceptos básicos. World Wide Web (WWW):

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Práctica 2. Montaje de Redes Locales. Parte III

INSTITUTO TECNOLÓGICO DE SALINA CRUZ. Fundamentos De Redes. Semestre Agosto-Diciembre Reporte De Lectura

Servidor FTP. Ing. Camilo Zapata Universidad de Antioquia

Manejo fácil de FTP con FileZilla

Programación páginas web. Servidor (PHP)

Patrones de Alto nivel: Patrones de Arquitectura Patrones de nivel medio: Patrones de Diseño Patrones de bajo nivel: Idioms

Aspectos básicos de redes Ing. Aníbal Coto Cortés

CAPITULO 3 MOVILIDAD EN LA NAVEGACIÓN Y ALMACENAMIENTO EN BASES DE DATOS

Ejercicio Guiado de Análisis y Diseño Orientado a Objetos. Ejemplo: CAJERO AUTOMÁTICO

Capitulo III. Diseño del Sistema.

4. Programación Paralela

Introducción al Capacity planning para servicios

UML, ejemplo sencillo sobre Modelado de un Proyecto

LABORATORIO DE RC PRÁCTICA 2: IMPLEMENTACIÓN DE UN CLIENTE Y SERVIDOR DE

Ingeniería del Software. Diseño. Diseño en el PUD. Diseño de software. Patrones arquitectónicos. Diseño Orientado a Objetos en UML

INTRODUCCIÓN. El protocolo TCP, funciona en el nivel de transporte del modelo de referencia OSI, proporcionando un transporte fiable de datos.

Service Oriented Architecture

COMUNICACIÓN ENTRE PROCESOS SOCKETS

PLANIFICACIÓN Y PRESENTACIÓN MATERIA/MÓDULO

PREPARATORIA DIURNA DE CUAUTLA

Práctico de Procesos, Hilos y Deadlock

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

Facultad de Ciencias del Hombre y la Naturaleza SISTEMAS OPERATIVOS DE REDES CICLO II Materia: Sistemas Operativos de Redes Tema:

Planificación, Gestión y Desarrollo de Proyectos

Reflexión. Inicio. Contenido

Procesos. Bibliografía. Threads y procesos. Definiciones

Práctica sobre compartición de instancias remotas.

Transcripción:

Tema 4 El paradigma cliente-servidor F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García Sistemas Distribuidos Grado en Ingeniería Informática Universidad Carlos III de Madrid

Contenido Conceptos básicos Tipo de servidores Servidores secuenciales y concurrentes Servidores orientados a conexión y sin conexión Servidores con/sin información de estado Sesión: interacción entre cliente y servidor Ejemplo: Cliente-servidor con paso de mensajes Guía de desarrollo de aplicaciones cliente-servidor 2

Una definición simple El software del servidor acepta peticiones de servicio desde el software del cliente, calcula el resultado y lo devuelve al cliente 3

Participantes Elementos de computación: Cliente Servidor Red de interconexión 1) Petición Red de interconexión 2) Respuesta Máquina cliente Máquina del servidor 4

Ejemplo: HTTP 1) Petición: http://www.arcos.inf.uc3m.es 2) Respuesta Cliente Servidor 1) Petición: 2) Respuesta: GET /index.html HTTP/1.1 HTTP/1.1 200 OK Host: www.example.com Date: Fri, 31 Dec 2003 23:59:59 GMT User-Agent: nombre-cliente Content-Type: text/html [Línea en blanco] Content-Length: 1221 <html> <body> <h1>página www.uc3m.es</h1> (Contenido)... </body> </html> 5

Acceso distribuido vs. computación distribuida La computación de tipo cliente-servidor es acceso distribuido no computación distribuida!!! 6

Cliente-Servidor Asigna roles diferentes a los procesos que comunican: cliente y servidor Servidor: Ofrece un servicio Elemento pasivo: espera la llegada de peticiones Cliente: Solicita el servicio Elemento activo: invoca peticiones Servidor Cliente 1... Cliente 2 Petición de servicio Proceso cliente Proceso servidor Servicio 7

Conceptos previos El modelo cliente-servidor es una abstracción eficiente para facilitar los servicios de red La asignación de roles asimétricos simplifica la sincronización Implementación mediante: Sockets Llamada a procedimientos remotos (RPC) Invocación de métodos remotos (RMI, CORBA, ). Paradigma principalmente adecuado para servicios centralizados Ejemplos: servicios de Internet (HTTP, FTP, DNS, ) 8

Tipos de servidores de aplicaciones En función del número de peticiones que es capaz de atender: Secuencial: una petición Concurrente: múltiples peticiones atendidas al mismo tiempo En función de si existe una conexión preestablecida con el cliente Servidores orientados a conexión Servidores NO orientados a conexión En función de si almacena o no el estado de la comunicación Servidores con estado Servidores sin estado 9

Modelo de servidor secuencial El servidor sirve las peticiones de forma secuencial Mientras está atendiendo a un cliente no puede aceptar peticiones de más clientes petición Cliente servidor respuesta 10

Flujo de ejecución de un servidor secuencial Inicio de servicio Aceptar petición de sesión Procesar la petición del cliente Servidor secuencial 11

Flujo de ejecución de un servidor secuencial Inicio de servicio Aceptar petición de sesión Procesar la petición del cliente Obtener el resultado + Devolver la respuesta al cliente Servidor secuencial 12

Cliente-Servidor secuencial Servidor Cliente 1 while(){ aceptar_peticion() tratar_peticion() } Cliente 2 Solicitud de conexión Sesión de servicio Cliente n 13

Cliente-Servidor secuencial Servidor Cliente 1 while(){ aceptar_peticion() tratar_peticion() } Cliente 2 Solicitud de conexión Sesión de servicio Cliente n 14

Cliente-Servidor secuencial Servidor Cliente 1 while(){ aceptar_peticion() tratar_peticion() } Cliente 2 Solicitud de conexión Sesión de servicio Cliente n 15

Modelo de servidor concurrente El servidor crea un hijo que atiende la petición y envía la respuesta al cliente Se pueden atender múltiples peticiones de forma concurrente Cliente petición servidor Crea un proceso hijo respuesta Proceso hijo 16

Flujo de ejecución de un servidor concurrente Servidor concurrente Inicio de servicio Aceptar petición de sesión Crear thread Trabajador 1 Crear thread Trabajador 2 Procesar la petición del cliente 1 Procesar la petición del cliente 2 fin fin Crear thread Trabajador n Procesar la petición del cliente n fin 17

Flujo de ejecución de un servidor concurrente Servidor concurrente Inicio de servicio Aceptar petición de sesión Obtener el resultado + Devolver la respuesta al cliente Crear thread Trabajador 1 Crear thread Trabajador 2 Procesar la petición del cliente 1 Procesar la petición del cliente 2 fin fin Crear thread Trabajador n Procesar la petición del cliente n fin 18

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Cliente 2 Solicitud de conexión Sesión de servicio Cliente n 19

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Cliente 2 Solicitud de conexión Sesión de servicio Cliente n 20

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Hilo 1 Cliente 2 Cliente n Solicitud de conexión Sesión de servicio 21

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Hilo 1 Cliente 2 Cliente n Solicitud de conexión Sesión de servicio 22

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Hilo 1 Hilo 2 Cliente 2 Cliente n Solicitud de conexión Sesión de servicio 23

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Hilo 1 Hilo 2 Cliente 2 Cliente n Solicitud de conexión Sesión de servicio 24

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Cliente 2 Solicitud de conexión Sesión de servicio Hilo n Hilo 1 Hilo 2 Cliente n 25

Cliente-Servidor concurrente Servidor Cliente 1 while(){ aceptar_peticion() pthread_create() } Cliente 2 Solicitud de conexión Sesión de servicio Hilo n Hilo 1 Hilo 2 Cliente n 26

Diseño de servidores concurrentes mediante threads Distintas arquitecturas de SW para construir servidores paralelos: Un proceso distribuidor que acepta peticiones y las distribuye entre un pool de procesos ligeros Cada proceso ligero realiza las mismas tareas: aceptar peticiones, procesarlas y devolver su resultado Segmentación: cada trabajo se divide en una serie de fases, cada una de ellas se procesa por un proceso ligero especializado Distribuidor Trabajador Núcleo E/S Solicitudes Núcleo E/S Solicitudes Núcleo E/S Solicitudes @Fuente: Jesús Carretero, Félix García, Pedro de Miguel y Fernando Pérez. Mc Graw Hill 27

Servidores orientados a conexión En un servicio orientado a conexión, el cliente y el servidor establecen una conexión (que puede ser lógica), posteriormente insertan o extraen datos desde esa conexión, y finalmente la liberan El flujo de tráfico se representa mediante un identificador de conexión Los datos no incluyen información sobre la conexión establecida Direcciones origen y destino Ejemplo: TCP 28

Servidores sin conexión En un protocolo no orientado a conexión los datos son intercambiados usando paquetes independientes, auto-contenidos, cada uno de los cuales necesita explícitamente la información de conexión No existe acuerdo previo Ejemplo: IP, UDP 29

Concepto de sesión Sesión: Interacción entre cliente y servidor Cada cliente entabla una sesión separada e independiente con el servidor El cliente conduce un diálogo con el servidor hasta obtener el servicio deseado El servidor ejecuta indefinidamente: Bucle continuo para aceptar peticiones de las sesiones de los clientes Para cada cliente el servidor conduce una sesión de servicio 30

Protocolo de servicio Se necesita un protocolo para especificar las reglas que deben observar el cliente y el servidor durante una sesión de servicio En cada sesión el diálogo sigue un patrón especificado por el protocolo Los protocolos de Internet están publicados en las RFCs Definición del protocolo de servicio: Localización del servicio Secuencia de comunicación entre procesos Representación en interpretación de los datos 31

Tipos de servidores Servidores sin estado: Cada mensaje de petición y respuesta es independiente de las demás Ejemplo: HTTP Servidores con estado: Debe mantener información de estado (por ej. anteriores conexiones de clientes) para proporcionar su servicio Cada petición/respuesta puede depender de otras anteriores Ejemplo: Telnet 32

Información de estado Información de estado global El servidor mantiene información para todos los clientes durante la vida del servidor Ejemplo: servidor de tiempo Información de estado de sesión El servidor mantiene información específica para cada sesión iniciada por los clientes Ejemplo: FTP (File Transfer Protocol) 33

Arquitectura de SW La arquitectura de SW de una aplicación cliente-servidor consta de tres niveles: Nivel de presentación: cliente y servidor precisan una interfaz de usuario Nivel de lógica de aplicación: en el lado del servidor necesita procesarse la petición del cliente, calcular el resultado y devolverlo al cliente. En el lado del cliente se necesita enviar al servicio la petición del usuario y procesar el resultado (por ejemplo, mostrarlo por pantalla) Nivel de servicio: los servicios requeridos para dar soporte a la aplicación son (1) en el servidor aquellos que permiten procesar la petición y 2) el mecanismo de IPC 34

Arquitectura de las aplicaciones Interfaz de usuario Lógica de presentación Lógica de aplicación Lógica de servicio 35

Donde se ejecutan las tareas? En el software del cliente (lado del cliente) En el software del servidor (lado del servidor) 36

Responsabilidades en el cliente Cliente: Genera un mensaje de petición de servicio Se conecta al servidor (dirección IP y puerto) [Solo orientado a conexión] Envía el mensaje de petición de servicio Espera por la respuesta Procesa la respuesta: imprimir, almacenar, etc. Desconexión [Solo orientado a conexión] 37

Responsabilidades en el servidor Servidor: 1. Espera conexiones entrantes de los clientes Una conexión entrante es una petición de servicio 2. Por cada conexión: Genera un thread de servicio [Solo servidores concurrentes] El proceso principal: Vuelve a esperar por nuevas conexiones entrantes El thread de servicio: 1. Procesa la petición 2. Calcula el resultado 3. Devuelve la respuesta al cliente 4. Finaliza su ejecución 38

Aplicaciones cliente-servidor usando colas de mensajes Modelo proceso ligero distribuidor: Cada petición al proceso ligero distribuidor supone la creación de un proceso ligero trabajador El proceso ligero trabajador responde al proceso cliente Procesa la petición Envía la respuesta al servidor Una vez finalizada la sesión con el cliente, el proceso ligero se destruye Modelo concurrente: Los procesos distribuidor y trabajador ejecutan de forma concurrente Modelo secuencial: Sólo un proceso distribuidor 39

Ejemplo: sumar dos números Máquina A cliente NÚCLEO sumar(5,2) Resultado = 7 Máquina B servidor 5+2 NÚCLEO @Fuente: Jesús Carretero, Félix García, Pedro de Miguel y Fernando Pérez. Mc Graw Hill RED 40

Ejemplo: Definición de tipos #define MAXSIZE 256 struct peticion { int a; /* operando 1 */ int b; /* operando 2 */ char q_name[maxsize]; /* nombre de la cola cliente donde debe enviar la respuesta el servidor */ }; 41

Ejemplo: Proceso servidor secuencial #include mensaje.h #include <mqueue.h> void main(void) { mqd_t q_servidor; /* cola de mensajes del servidor */ mqd_t q_cliente; /* cola de mensajes del cliente */ struct peticion pet; int res; struct mq_attr attr; attr.mq_maxmsg = 20; attr.mq_msgsize = sizeof(struct peticion); q_servidor = mq_open( SERVIDOR_SUMA, O_CREAT O_READ, 0700, &attr); while(1) { mq_receive(q_servidor, &pet, sizeof(pet), 0); res = pet.a + pet.b; /* se responde al cliente abriendo previamente su cola */ q_cliente = mq_open(pet.q_name, O_WRONLY); } } mq_send(q_cliente, &res, sizeof(int), 0); mq_close(q_cliente); 42

Ejemplo: Proceso cliente #include mensaje.h #include <mqueue.h> void main(void) { mqd_t q_servidor; /* cola de mensajes del proceso servidor */ mqd_t q_cliente; /* cola de mensajes para el proceso cliente */ struct peticion pet; int res; struct mq_attr attr; attr.mq_maxmsg = 1; attr.mq_msgsize = sizeof(int); q_cliente = mq_open( CLIENTE_UNO, O_CREAT O_RDONLY, 0700, &attr); q_servidor = mq_open( SERVIDOR_SUMA, O_WRONLY); /* se rellena la petición */ pet.a = 5; pet.b = 2; strcpy(pet.q_name, CLIENTE_UNO ); mq_send(q_servidor, &pet, sizeof(struct petiticion), 0); mq_receive(q_cliente, &res, sizeof(int), 0); } mq_close(q_servidor); mq_close(q_cliente); mq_unlink( CLIENTE_UNO ); 43

Ejemplo II: Servidor concurrente Máquina A sumar(5,2) cliente Resultado = 7 Máquina B NÚCLEO Máquina A cliente RED servidor 5+2 NÚCLEO NÚCLEO 44

Estructura de un servidor multihread Proceso cliente Proceso cliente Cola del cliente petición Cola del cliente Proceso servidor petición respuesta Cola del servidor Creación del thread Creación del thread respuesta Thread que sirve la petición Thread que sirve la petición 45

Cliente-servidor con colas de mensajes Proceso cliente Cola del cliente petición Proceso servidor respuesta Proceso while (1) ligero { principal mq_receive se crea el proceso ligero esperar la copia del mensaje } mensaje Copia el mensaje despierta al principal continua la ejecución responde al cliente Copia del mensaje 46

Servidor multithread con colas de mensajes (I) #include mensaje.h #include <mqueue.h> #include <pthread.h> #include <stdio.h> /* mutex y variables condicionales para proteger la copia del mensaje*/ pthread_mutex_t mutex_mensaje; int mensaje_no_copiado = TRUE; /* TRUE con valor a 1 */ pthread_cond_t cond_mensaje; int main(void) { mqd_t q_servidor; /* cola del servidor */ struct peticion mess; /* mensaje a recibir */ struct mq_attr q_attr; /* atributos de la cola */ pthread_attr_t t_attr; /* atributos de los threads */ attr.mq_maxmsg = 20; attr.mq_msgsize = sizeof(struct peticion)); 47

Servidor multithread con colas de mensajes (II) q_servidor = mq_open( SERVIDOR, O_CREAT O_RDONLY, 0700, &attr); if (q_servidor == -1) { } perror( No se puede crear la cola de servidor ); return 1; pthread_mutex_init(&mutex_mensaje, NULL); pthread_cond_init(&cond_mensaje, NULL); pthread_attr_init(&attr); /* atributos de los threads */ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);.. 48

Servidor multithread con colas de mensajes (III) while (TRUE) { mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0); pthread_create(&thid, &attr, tratar_mensaje, &mess); } } 49

Servidor multithread con colas de mensajes (IV) while (TRUE) { mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0); pthread_create(&thid, &attr, tratar_mensaje, &mess); Condición de carrera } } 50

Servidor multithread con colas de mensajes (V) while (TRUE) { mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0); pthread_create(&thid, &attr, tratar_mensaje, &mess); Sección crítica /* se espera a que el thread copie el mensaje */ pthread_mutex_lock(&mutex_mensaje); while (mensaje_no_copiado) pthread_cond_wait(&cond_mensaje, &mutex_mensaje); mensaje_no_copiado = TRUE; pthread_mutex_unlock(&mutex_mensaje); } /* FIN while */ } /* Fin main */ 51

Servidor multithread con colas de mensajes (VI) void tratar_mensaje(struct mensaje *mes){ struct peticion mensaje; /* mensaje local */ struct mqd_t q_cliente; /* cola del cliente */ int resultado; /* resultado de la operación */ /* el thread copia el mensaje a un mensaje local */ pthread_mutex_lock(&mutex_mensaje); memcpy((char *) &mensaje, (char *)&mes, sizeof(struct peticion)); /* ya se puede despertar al servidor*/ mensaje_no_copiado = FALSE; /* FALSE con valor 0 */ pthread_cond_signal(&cond_mensaje); pthread_mutex_unlock(&mutex_mensaje); 52

Servidor multithread con colas de mensajes (VII) /* ejecutar la petición del cliente y preparar respuesta */ resultado = mensaje_local.a + mensaje_local.b; /* Se devuelve el resultado al cliente */ /* Para ello se envía el resultado a su cola */ q_cliente = mq_open(mensaje_local.nombre, O_WRONLY); } if (q_cliente == -1) perror( No se puede abrir la cola del cliente */ else { mq_send(q_cliente, (char *) &resultado, sizeof(int), 0); mq_close(q_cliente); } pthread_exit(0); 53

Proceso cliente #include mensaje.h #include <mqueue.h> void main(void) { mqd_t q_servidor; /* cola de mensajes del proceso servidor */ mqd_t q_cliente; /* cola de mensajes para el proceso cliente */ struct peticion pet; int res; struct mq_attr attr; attr.mq_maxmsg = 1; attr.mq_msgsize = sizeof(int); q_cliente = mq_open( CLIENTE_UNO, O_CREAT O_RDONLY, 0700, &attr); q_servidor = mq_open( SERVIDOR_SUMA, O_WRONLY); /* se rellena la petición */ pet.a = 5; pet.b = 2; strcpy(pet.q_name, CLIENTE_UNO ); mq_send(q_servidor, &pet, sizeof(struct petiticion), 0); mq_receive(q_cliente, &res, sizeof(int), 0); } mq_close(q_servidor); mq_close(q_cliente); mq_unlink( CLIENTE_UNO ); 54

Guía de desarrollo de aplicaciones cliente-servidor con paso de mensajes 1. Identificar el cliente y el servidor Cliente: elemento activo, varios Servidor: elemento pasivo 2. Protocolo del servicio Identificar los tipos mensajes y la secuencia de intercambios de mensajes (peticiones y respuestas) 3. Elegir el tipo de servidor UDP sin conexión TCP : Una conexión por sesión Una conexión por petición 4. Identificar el formato de los mensajes (representación de los datos) Independencia (lenguaje, arquitectura, implementación, ) 55