next up previous
Next: Paquetes de datos para Up: Bloque de control y Previous: Paquetes de datos hacia

Solicitud de punto de servicio

Cuando una aplicación quiere actuar como servidor debe eligir un número que le sirva de punto de acceso al servicio. Este valor, junto con el que identifica a la entidad de comunicación es lo que necesita conocer el cliente para ponerse en comunicación con este servidor. Este valor le identifica entre todos los posibles servidores sobre la misma entidad de comunicación, así pues no puede haber dos servidores en la misma entidad que empleen el mismo punto de acceso al servicio. Dado que una aplicación no tiene por qué tener conocimiento de los puntos de acceso que se están empleando resolveremos esto pidiendo permiso al bloque $A$ para emplear un valor de punto de acceso al servicio. El bloque $A$ guardará un registro de los puntos de acceso que se están empleando en un momento dado para autorizar a un servidor el uso de uno o rechazárselo.

Figura 9: Puntos de acceso al servicio
\begin{figure}\begin{center}
\epsfig{file=./figuras/fig9.eps,width=12cm}\end{center}\end{figure}

Para implementar esta funcionalidad emplearemos un mensaje de control que la librería enviará en favor de la aplicación a la entidad de comunicación. Este mensaje irá por la cola de mensajes de la cual espera datos el bloque $A$ y lo reconocerá por no tener el mismo tipo que los datos sino otro diferente. En este mensaje, cuya estructura se incluye a continuación, se especificará que se desea emplear un cierto valor como punto de acceso.

typedef struct msg_ctrl_accept
{
     int	tipo; // Tipo de mensaje MSG_ACCEPT
     int	id_cli; // Valor de punto de acceso que se desea emplear
     key_t	clavecola; // clave de la cola de mensajes por la que se
                              espera la confirmacion/rechazo
} msg_ctrl_accept;

El bloque $A$ deberá comprobar si existe ya alguna aplicación empleando este punto de acceso y mandará un mensaje de vuelta a la aplicación autorizando su uso o rechazándolo. Dado que las colas de mensajes son unidireccionales el bloque $A$ no podrá contestar por el mismo canal por el cual ha recibido la solicitud. Para resolver esto la librería, antes de enviar este mensaje de solicitud, creará una nueva cola de mensajes y enviará su clave al bloque $A$ dentro del mensaje de solicitud de reserva de punto de acceso (campo clavecola). Para enviar la respuesta, el bloque $A$ accederá a la cola cuya clave ha obtenido en el mensaje y enviará por ella la respuesta. Tras enviarla se deshace de esta cola auxiliar y el servidor destruye la cola al recibir por ella la respuesta. Este esquema se puede ver en la figura 10 y la estructura del mensaje de respuesta asignando ese punto de acceso es la siguiente:

typedef struct msg_ctrl_accept_ack
{
     int	tipo; // Tipo de mensaje MSG_ACCEPT_ACK
     key_t	clavemem; // clave de la zona de memoria compartida
     key_t	clavesem1_paquetes; // clave del semaforo 1
     key_t	clavesem2_huecos; // clave del semaforo 2
} msg_ctrl_accept_ack;

En caso de que ese valor de punto de acceso ya se esté empleando enviará un mensaje diferente para indicar tal contingencia:

typedef struct msg_fin
{
     int	tipo; // Tipo de mensaje MSG_FIN
     int	id_cli; // El valor que no se ha podido reservar
} msg_fin;

Figura 10: Peticion de punto de acceso al servicio
\begin{figure}\begin{center}
\epsfig{file=./figuras/fig10.eps,width=12cm}\end{center}\end{figure}

Es evidente que el bloque $A$ (implementado en el programa nucleo) deberá recordar todos los valores de puntos de acceso al servicio que están siendo empleados. Para ello se recomienda emplear una lista dado que este bloque no sabe cuántos servidores van a existir y le conviene ir reservando y liberando puntos de acceso con tan solo las limitaciones de memoria y sin desperdiciarla.


next up previous
Next: Paquetes de datos para Up: Bloque de control y Previous: Paquetes de datos hacia
Daniel Morato 2000-11-06