Sei sulla pagina 1di 55

Tema 4

El paradigma cliente-servidor
F. Garca-Carballeira, M. Soledad Escolar,
Luis Miguel Snchez, Fco. Javier Garca
Sistemas Distribuidos
Grado en Ingeniera Informtica
Universidad Carlos III de Madrid

Contenido



Conceptos bsicos
Tipo de servidores




Sesin:


interaccin entre cliente y servidor

Ejemplo:


Servidores secuenciales y concurrentes


Servidores orientados a conexin y sin conexin
Servidores con/sin informacin de estado

Cliente-servidor con paso de mensajes

Gua de desarrollo de aplicaciones cliente-servidor


F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Una definicin simple

El software del servidor acepta peticiones de


servicio desde el software del cliente, calcula el
resultado y lo devuelve al cliente

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Participantes


Elementos de computacin:




Cliente
Servidor
Red de interconexin
1) Peticin
Red de interconexin
2) Respuesta

Mquina
cliente

Mquina del
servidor

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Ejemplo: HTTP
1) Peticin:
http://www.arcos.inf.uc3m.es

2) Respuesta

Cliente
1)

Peticin:

Servidor
2)

GET /index.html HTTP/1.1


Host: www.example.com
User-Agent: nombre-cliente
[Lnea en blanco]

Respuesta:
HTTP/1.1 200 OK
Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221
<html>
<body>
<h1>Pgina www.uc3m.es</h1>
(Contenido) . . .
</body>
</html>

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Acceso distribuido vs.


computacin distribuida

La computacin de tipo cliente-servidor


es acceso distribuido
no computacin distribuida !!!

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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

Peticin de servicio
Proceso cliente
Proceso servidor
Servicio

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Conceptos previos
El modelo cliente-servidor es una abstraccin eficiente para
facilitar los servicios de red
La asignacin de roles asimtricos simplifica la sincronizacin
Implementacin mediante:
 Sockets
 Llamada a procedimientos remotos (RPC)
 Invocacin de mtodos remotos (RMI, CORBA, ).
Paradigma principalmente adecuado para servicios
centralizados
Ejemplos: servicios de Internet (HTTP, FTP, DNS, )








F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Tipos de servidores de aplicaciones




En funcin del nmero de peticiones que es capaz de atender:





En funcin de si existe una conexin preestablecida con el cliente





Secuencial: una peticin


Concurrente: mltiples peticiones atendidas al mismo tiempo

Servidores orientados a conexin


Servidores NO orientados a conexin

En funcin de si almacena o no el estado de la comunicacin





Servidores con estado


Servidores sin estado

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Modelo de servidor secuencial





El servidor sirve las peticiones de forma secuencial


Mientras est atendiendo a un cliente no puede aceptar
peticiones de ms clientes
peticin

servidor

Cliente

respuesta

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

10

Flujo de ejecucin de un servidor


secuencial

Inicio de servicio

Aceptar peticin de
sesin

Procesar la peticin del


cliente

Servidor secuencial
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

11

Flujo de ejecucin de un servidor


secuencial

Inicio de servicio

Aceptar peticin de
sesin

Obtener el
resultado
+
Devolver la
respuesta al cliente

Procesar la peticin del


cliente

Servidor secuencial
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

12

Cliente-Servidor secuencial
Servidor

while(){
aceptar_peticion()
tratar_peticion()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Cliente n

13

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Sesin de
servicio

Cliente-Servidor secuencial
Servidor

while(){
aceptar_peticion()
tratar_peticion()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Cliente n

14

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Sesin de
servicio

Cliente-Servidor secuencial
Servidor

while(){
aceptar_peticion()
tratar_peticion()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Cliente n

15

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Sesin de
servicio

Modelo de servidor concurrente





El servidor crea un hijo que atiende la peticin y enva la


respuesta al cliente
Se pueden atender mltiples peticiones de forma concurrente
peticin

servidor

Cliente
Crea un proceso
hijo
respuesta

Proceso
hijo

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

16

Flujo de ejecucin de un servidor


concurrente
Servidor concurrente
Inicio de servicio
Aceptar peticin de
sesin
Crear thread
Trabajador 1

Procesar la peticin
del cliente 1

fin

Crear thread
Trabajador 2

Procesar la peticin
del cliente 2

fin

Crear thread
Trabajador n

Procesar la peticin
del cliente n

fin

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

17

Flujo de ejecucin de un servidor


concurrente
Servidor concurrente
Obtener el
resultado
+
Devolver la
respuesta al cliente

Inicio de servicio
Aceptar peticin de
sesin
Crear thread
Trabajador 1

Procesar la peticin
del cliente 1

fin

Crear thread
Trabajador 2

Procesar la peticin
del cliente 2

fin

Crear thread
Trabajador n

Procesar la peticin
del cliente n

fin

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

18

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Cliente n

19

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Cliente n

20

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Hilo 1
Cliente n

21

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Hilo 1
Cliente n

22

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Hilo 1
Cliente n

Hilo 2

23

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Hilo 1
Cliente n

Hilo 2

24

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Hilo 1
Cliente n

Hilo 2
Hilo n

25

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Cliente-Servidor concurrente
Servidor

while(){
aceptar_peticion()
pthread_create()
}

Cliente 1

Solicitud de
conexin
Cliente 2

Sesin de
servicio

Hilo 1
Cliente n

Hilo 2
Hilo n

26

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Diseo 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

Segmentacin: cada trabajo se divide en una serie de fases, cada una de ellas se
procesa por un proceso ligero especializado

E/S

Solicitudes

Ncleo

Ncleo

E/S

Ncleo

E/S

Solicitudes

Trabajador

Distribuidor

Solicitudes

@Fuente: Jess Carretero, Flix Garca, Pedro de Miguel y Fernando Prez. Mc Graw Hill

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

27

Servidores orientados a conexin




En un servicio orientado a conexin, el cliente y el


servidor establecen una conexin (que puede ser lgica),
posteriormente insertan o extraen datos desde esa
conexin, y finalmente la liberan


Los datos no incluyen informacin sobre la conexin


establecida


El flujo de trfico se representa mediante un identificador de


conexin

Direcciones origen y destino

Ejemplo: TCP

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

28

Servidores sin conexin




En un protocolo no orientado a conexin los datos


son intercambiados usando paquetes independientes,
auto-contenidos, cada uno de los cuales necesita
explcitamente la informacin de conexin


No existe acuerdo previo

Ejemplo: IP, UDP

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

29

Concepto de sesin



Sesin: Interaccin entre cliente y servidor


Cada cliente entabla una sesin separada e independiente
con el servidor


El cliente conduce un dilogo 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 sesin de servicio

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

30

Protocolo de servicio


Se necesita un protocolo para especificar las reglas que


deben observar el cliente y el servidor durante una
sesin de servicio



En cada sesin el dilogo sigue un patrn especificado por el


protocolo
Los protocolos de Internet estn publicados en las RFCs

Definicin del protocolo de servicio:






Localizacin del servicio


Secuencia de comunicacin entre procesos
Representacin en interpretacin de los datos
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

31

Tipos de servidores


Servidores sin estado:





Cada mensaje de peticin y respuesta es independiente de las


dems
Ejemplo: HTTP

Servidores con estado:






Debe mantener informacin de estado (por ej. anteriores


conexiones de clientes) para proporcionar su servicio
Cada peticin/respuesta puede depender de otras anteriores
Ejemplo: Telnet

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

32

Informacin de estado


Informacin de estado global





El servidor mantiene informacin para todos los clientes


durante la vida del servidor
Ejemplo: servidor de tiempo

Informacin de estado de sesin





El servidor mantiene informacin especfica para cada sesin


iniciada por los clientes
Ejemplo: FTP (File Transfer Protocol)

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

33

Arquitectura de SW


La arquitectura de SW de una aplicacin cliente-servidor


consta de tres niveles:



34

Nivel de presentacin: cliente y servidor precisan una interfaz de usuario


Nivel de lgica de aplicacin: en el lado del servidor necesita procesarse
la peticin del cliente, calcular el resultado y devolverlo al cliente. En el
lado del cliente se necesita enviar al servicio la peticin del usuario y
procesar el resultado (por ejemplo, mostrarlo por pantalla)
Nivel de servicio: los servicios requeridos para dar soporte a la
aplicacin son (1) en el servidor aquellos que permiten procesar la
peticin y 2) el mecanismo de IPC

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

Arquitectura de las aplicaciones

Interfaz de usuario
Lgica de presentacin
Lgica de aplicacin
Lgica de servicio

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

35

Donde se ejecutan las tareas?





En el software del cliente (lado del cliente)


En el software del servidor (lado del servidor)

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

36

Responsabilidades en el cliente


Cliente:







Genera un mensaje de peticin de servicio


Se conecta al servidor (direccin IP y puerto) [Solo orientado
a conexin]
Enva el mensaje de peticin de servicio
Espera por la respuesta
Procesa la respuesta: imprimir, almacenar, etc.
Desconexin [Solo orientado a conexin]

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

37

Responsabilidades en el servidor


Servidor:
Espera conexiones entrantes de los clientes

1.


Una conexin entrante es una peticin de servicio

Por cada conexin:

2.



Genera un thread de servicio [Solo servidores concurrentes]


El proceso principal:


Vuelve a esperar por nuevas conexiones entrantes

El thread de servicio:
1.
2.
3.
4.

Procesa la peticin
Calcula el resultado
Devuelve la respuesta al cliente
Finaliza su ejecucin

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

38

Aplicaciones cliente-servidor usando colas


de mensajes


Modelo proceso ligero distribuidor:





Cada peticin al proceso ligero distribuidor supone la creacin de un


proceso ligero trabajador
El proceso ligero trabajador responde al proceso cliente



Una vez finalizada la sesin con el cliente, el proceso ligero se destruye

Modelo concurrente:


Procesa la peticin
Enva la respuesta al servidor

Los procesos distribuidor y trabajador ejecutan de forma concurrente

Modelo secuencial:


Slo un proceso distribuidor

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

39

Ejemplo: sumar dos nmeros

Mquina A
cliente

Mquina B
sumar(5,2)

servidor
5+2

NCLEO

Resultado = 7

NCLEO

@Fuente: Jess Carretero, Flix Garca, Pedro de Miguel y Fernando Prez. Mc Graw Hill

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

RED

40

Ejemplo: Definicin de tipos


#define MAXSIZE
struct peticion

256
{

int a;

/* operando 1 */

int b;

/* operando 2 */

char q_name[MAXSIZE];

/* nombre de la cola cliente


donde debe enviar la respuesta
el servidor */

};

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

41

Ejemplo: Proceso servidor secuencial


#include mensaje.h
#include <mqueue.h>
void main(void) {
mqd_t q_servidor;
mqd_t q_cliente;
struct peticion pet;
int res;
struct mq_attr attr;

/* cola de mensajes del servidor */


/* cola de mensajes del cliente */

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);
}
}
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

42

Ejemplo: Proceso cliente


#include mensaje.h
#include <mqueue.h>
void main(void) {
mqd_t q_servidor;
mqd_t q_cliente;
struct peticion pet;
int res;
struct mq_attr attr;

/* cola de mensajes del proceso servidor */


/* cola de mensajes para el proceso cliente */

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 peticin */
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);
}
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

43

Ejemplo II: Servidor concurrente


Mquina A
cliente

sumar(5,2)
Resultado = 7
Mquina B

NCLEO

servidor
RED

5+2

Mquina A
cliente

NCLEO

NCLEO
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

44

Estructura de un servidor multihread


Proceso cliente

Proceso cliente

Cola del
cliente

Cola del
cliente

peticin

peticin

Proceso servidor
respuesta

Cola del
servidor

respuesta
Creacin del
thread

Creacin del
thread

Thread que
sirve la peticin

Thread que
sirve la peticin

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

45

Cliente-servidor con colas de mensajes


Proceso cliente
Cola del
cliente

peticin

Proceso servidor
mensaje
respuesta
Proceso
ligero
principal

while (1)
{
mq_receive
se crea el proceso ligero
esperar la copia del mensaje
}

Copia del
mensaje
Copia el mensaje
despierta al principal
continua la ejecucin
responde al cliente

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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));
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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);
..

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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);

}
}

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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);

Condicin de carrera
}
}

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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);

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

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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 operacin */
/* 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);

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

52

Servidor multithread con colas de mensajes


(VII)
/* ejecutar la peticin del cliente y preparar respuesta */
resultado = mensaje_local.a + mensaje_local.b;
/* Se devuelve el resultado al cliente */
/* Para ello se enva 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);
}
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

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 peticin */
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);
}

F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca


Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

54

Gua 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 conexin
TCP :






4.

Una conexin por sesin


Una conexin por peticin

Identificar el formato de los mensajes (representacin de los


datos)


Independencia (lenguaje, arquitectura, implementacin, )


F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca

Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.

55

Potrebbero piacerti anche