Publicado el 25 de Agosto del 2019
426 visualizaciones desde el 25 de Agosto del 2019
203,2 KB
16 paginas
Creado hace 7a (07/11/2016)
Recepción con Handlers en Lower Layer UDP
Programación de Sistemas de Telecomunicación
Informática II
Departamento de Sistemas Telemáticos y Computación (GSyC)
Noviembre de 2016
GSyC - 2016
Recepción con Handlers en LLU
1
c2016 Grupo de Sistemas y Comunicaciones.
Algunos derechos reservados.
Este trabajo se distribuye bajo la licencia
Creative Commons Attribution Share-Alike
disponible en http://creativecommons.org/licenses/by-sa/2.1/es
GSyC - 2016
Recepción con Handlers en LLU
2
Contenidos
1
Introducción
2 Recepción mediante handlers en LLU
3 Programación con Handlers
GSyC - 2016
Recepción con Handlers en LLU
3
Contenidos
Introducción
1
Introducción
2 Recepción mediante handlers en LLU
3 Programación con Handlers
GSyC - 2016
Recepción con Handlers en LLU
4
Llamadas bloqueantes
Introducción
¿Qué es una llamada bloqueante?
Las llamadas a algunos subprogramas bloquean el flujo de ejecución
del programa hasta que ocurran eventos externos al programa
Ejemplo: la lectura de texto del teclado mediante
Ada.Text IO.Get Immediate o Ada.Text IO.Get Line
bloquea el flujo de ejecución del programa hasta que el
usuario introduzca algún texto por el teclado:
Durante este tiempo el programa NO puede realizar otras
acciones como recibir mensajes.
GSyC - 2016
Recepción con Handlers en LLU
5
Llamadas bloqueantes
Introducción
La llamada a LLU.Receive es bloqueante
Por esta razón en Mini-Chat un cliente no puede ser lector y
escritor a la vez: no puede recibir los mensajes que le envía el
servidor y a la vez estar leyendo cadenas de texto del teclado.
La recepción de mensajes en Lower Layer UDP (LLU)
mediante la llamada LLU.Receive bloquea el flujo de
ejecución del programa hasta que se reciba algún mensaje, o
venza el timeout especificado en la llamada
Durante este tiempo el programa NO puede realizar otras
acciones como leer del teclado o enviar mensajes.
Cuando se usa LLU.Receive el programador SÍ determina el
momento en el que quiere recibir un mensaje
OJO, no siempre es malo recibir mediante LLU.Receive: en
ocasiones un programa no puede hacer nada si no recibe un
mensaje.
GSyC - 2016
Recepción con Handlers en LLU
6
Recepción mediante handlers en LLU
Contenidos
1
Introducción
2 Recepción mediante handlers en LLU
3 Programación con Handlers
GSyC - 2016
Recepción con Handlers en LLU
7
Recepción mediante handlers en LLU
Recepción mediante handlers en LLU
En Lower Layer UDP la recepción de mensajes mediante
handlers o manejadores permite que el flujo de ejecución del
programa no se detenga para esperar a recibir mensajes
El programa delega en el sistema la tarea de esperar a recibir
mensajes y la de llamar al handler justo cuando llegue uno. El
handler contiene el código que el programador quiere que se
ejecute cuando se reciba un mensaje.
Ejecución concurrente: Mientras que el sistema está ejecutando
el handler porque ha llegado un mensaje, el programa principal
puede estar ejecutando simultáneamente cualquier otro código:
leer del teclado,
enviar mensajes,
recibir mensajes de manera bloqueante con LLU.Receive en
otro End Point,
e incluso recibir mensajes de manera no bloqueante con handlers
en otro End Point,...
GSyC - 2016
Recepción con Handlers en LLU
8
Recepción mediante handlers en LLU
Recepción mediante handlers en LLU
GSyC - 2016
Recepción con Handlers en LLU
9
procedurePrograma_PrincipalisbeginLLU.Bind(EP_Handler, Handlers.Nombre_Del_Handler'Access);loop……Get_Line;endloop;endPrograma_Principal;UDPIPEthernet…loop…Receive(EP_Handler, P_Buff, 1.0, Expired);Handlers.Nombre_Del_Handler(From, EP_Handler, P_Buff);endloop;…Lower_Layer_UDPPrograma de UsuarioTrama EthernetEP_HandlerCódigo que se ejecuta a la vezP_Buffpackagebody HandlersisprocedureNombre_Del_Handler( From: in LLU.End_Point_Type;To: in LLU.End_Point_Type;P_Buff: accessLLU.Buffer_Type) is…begin…Client_EP:=LLU.End_Point_Type’Input(P_Buff);Request:= ASU.Unbounded_String’Input(P_Buff);…endNombre_Del_Handler;endHandlers; Programación con Handlers
Contenidos
1
Introducción
2 Recepción mediante handlers en LLU
3 Programación con Handlers
GSyC - 2016
Recepción con Handlers en LLU
10
Programación con Handlers
Programación con handlers
El programador escribe el código que debe ejecutarse cuando
se reciba un mensaje en un subprograma al que llamaremos
handler
El código del handler necesariamente debe estar dentro de un
paquete, no puede estar en el fichero del programa principal.
La especificación del handler está predeterminada pues hay
código en el sistema que llamará al handler y ha de coincidir
con la especificación a la que llamará este código
La función del código que se escribe en el handler es procesar
los contenidos de cada mensaje que vaya llegando
El programador asocia el handler a un End_Point en el
momento de llamar a Bind o a Bind_Any
El programador NO escribe código para llamar al subprograma
handler, sino que es el sistema el que llama al handler cada
vez que llega un mensaje.
GSyC - 2016
Recepción con Handlers en LLU
11
Programación con Handlers
Especificación del handler
La especificación del handler tiene que ser obligatoriamente la
siguiente:
with Lower_Layer_UDP;
package Handlers is
package LLU renames Lower_Layer_UDP;
procedure Nombre_Del_Handler (From:
in
in
To:
P_Buffer: access Buffer_Type);
End_Point_Type;
End_Point_Type;
end Handlers;
Parámetros:
From: End_Point interno de Lower_Layer_UDP que no
utilizaremos.
To: End_Point al que venía destinado el mensaje recibido
P_Buffer: puntero al Buffer que contiene el mensaje recibido
GSyC - 2016
Recepción con Handlers en LLU
12
Programación con Handlers
Cuerpo del handler
En el cuerpo del handler se escribe el código para extraer los
campos del buffer que el sistema le pasa al handler en el
parámetro P_Buffer con los contenidos del mensaje recibido
Es importante que el handler termine lo antes posible, pues
mientras que se está ejecutando no se están procesando
nuevos mensajes que pueden estar llegando a la máquina
En particular, es importante no hacer llamadas bloqueantes en
el código del handler, como Get Line o LLU.Receive
GSyC - 2016
Recepción con Handlers en LLU
13
Programación con Handlers
Cuerpo del handler
Ejemplo:
with Ada.Text_IO;
with Ada.Strings.Unbounded;
package body Handlers is
package ASU renames Ada.Strings.Unbounded;
procedure Nombre_Del_Handler (From:
End_Point_Type;
To:
End_Point_Type;
P_Buffer: access Buffer_Type) is
in
in
Client_EP: LLU.End_Point_Type;
Request : ASU.Unbounded_String;
Reply : ASU.Unbounded_String := "¡Bienvenido!";
begin
-- Suponemos que los mensajes que se reciben
-- contienen un End_Point y un Unbounded_String
Client_EP := LLU.End_Point_Type’Input (P_Buffer);
Request := ASU.Unbounded_String’Input (P_Buffer);
Ada.Text_IO.Put_Line (ASU.To_String (Request));
LLU.Reset (P_Buffer.all);
ASU.Unbounded_String’Output (P_Buffer, Reply);
LLU.Send (Client_EP, P_Buffer);
end Nombre_Del_Handler;
end Handlers;
NOTA: P_Buffer es un puntero a un Buffer_Type, y no un Buffer_Type
GSyC - 2016
Recepción con Handlers en LLU
14
Programación con Handlers
Asociación del handler a un End Point con Bind/Bind Any
El programador asocia en su código el handler a un
End_Point en el momento de llamar a Bind o Bind_Any.
Desde ese momento si se reciben mensajes el sistema
llamará al handler
En los End_Points a los que el programa se ha atado con un
handler no se puede recibir con LLU.Receive
A Bind/Bind_Any se le pasan como argumentos un
End Point y un puntero al handler
Hasta que no se llame a LLU.Finalize el sistema
seguirá llamando a los handlers para procesar los mensajes
que se sigan recibiendo, incluso cuando no queden más
sentencias para ejecutar en el programa principal.
GSyC - 2016
Recepción con Handlers en LLU
15
Programación con Handlers
Asociación del handler a un End Point con Bind/Bind Any
Ejemplo con Bind:
...
Server_EP := LLU.Build ("127.0.0.1", 6123);
-- Tras llamar a Bind ya se pueden estar recibiendo
-- mensajes automáticamente en el manejador
LLU.Bind (Server_EP, Handlers.Server_Handler’Access);
Ejemplo con Bind Any:
-- Tras llamar a Bind_Any ya se pueden estar recibiendo
-- mensajes automáticamente en el manejador
LLU.Bind_Any (Client_EP, Handlers.Client_Handler’Access);
GSyC - 2016
Recepción con Handlers en LLU
16
Comentarios de: Recepción con Handlers en Lower Layer UDP (0)
No hay comentarios