Aceptar solicitudes de conexión
Si una aplicación llama a la función WSAAccept, accept o AcceptEx para aceptar una solicitud de conexión entrante en un socket, el conmutador Windows Sockets reenvía siempre esta llamada al proveedor de servicios TCP/IP. Si llega una solicitud de conexión entrante desde una red que no es SAN, fluye a través de la ruta de acceso NDIS y el proveedor de servicios TCP/IP lo controla. Si una solicitud de conexión llega desde un par remoto en una SAN, el conmutador actúa como intermediario entre el proveedor de servicios TCP/IP y el proveedor de servicios SAN para determinar si aceptar la solicitud de conexión y completar la función WSAAccept, accept o AcceptEx de la aplicación.
En la ilustración siguiente se muestra información general sobre la interacción entre el conmutador de Windows Sockets y el proveedor de servicios SAN para determinar si se debe aceptar o rechazar una solicitud de conexión entrante. Las secuencias y secciones siguientes describen la determinación de aceptación con más detalle.
Para aceptar o rechazar una solicitud de conexión
Al recibir una solicitud de conexión entrante de un mismo nivel remoto, el proveedor de servicios SAN señala un objeto de evento como se describe en Escuchar conexiones en una SAN.
El modificador de Windows Sockets llama a la función WSPEnumNetworkEvents del proveedor de servicios SAN para recibir el código de evento FD_ACCEPT.
Al recibir el código de evento FD_ACCEPT, el modificador llama a la función WSPAccept del proveedor de servicios SAN para aceptar o rechazar la solicitud de conexión entrante.
En la llamada del conmutador a la función WSPAccept del proveedor de servicios SAN, el modificador especifica una función de condición. El proveedor de servicios SAN debe llamar a esta función de condición en el mismo subproceso en el que se llamó a la función WSPAccept antes de devolver desde la llamada de WSPAccept .
El modificador devuelve el código CF_ACCEPT o CF_REJECT de esta función de condición para indicar que acepta o rechaza la solicitud de conexión, respectivamente.
Aceptar una solicitud de conexión y crear un socket de aceptación
Si una aplicación acepta una solicitud de conexión entrante, el modificador devuelve el código CF_ACCEPT al proveedor de servicios SAN para completar la función de condición del conmutador. Al recibir CF_ACCEPT, el proveedor de servicios SAN inicializa una estructura de datos interna en la que almacena información sobre el socket de aceptación. La función WSPAccept del proveedor de servicios SAN debe llamar a la función WPUCreateSocketHandle para adquirir un descriptor para el socket aceptado del conmutador. El proveedor de servicios SAN debe almacenar el descriptor del modificador en su estructura de datos interna para el socket de aceptación y debe devolver su propio descriptor para que el socket de aceptación complete la llamada A WSPAccept . El modificador debe proporcionar el descriptor interno del proveedor de servicios SAN para el socket de aceptación al llamar a las funciones del proveedor de servicios SAN, mientras que el proveedor de servicios SAN debe proporcionar el descriptor de socket del conmutador en las llamadas al conmutador.
Antes de completar correctamente WSPAccept, el proveedor de servicios SAN debe llamar a la función ResetEvent de Win32 para restablecer el objeto de evento. Al hacerlo, el proveedor de servicios SAN puede llamar posteriormente a la función SetEvent de Win32 para indicar al conmutador que acepte la siguiente solicitud de conexión entrante.
Rechazar una solicitud de conexión
Si una aplicación rechaza una solicitud de conexión entrante, el modificador devuelve el código de CF_REJECT al proveedor de servicios SAN para completar la función de condición del modificador. Al recibir CF_REJECT, el proveedor de servicios SAN debe devolver el código de error WSAECONNREFUSED al modificador para completar la llamada de WSPAccept .
Indica la aceptación o denegación de una solicitud de conexión a un mismo nivel remoto
Antes de que un proveedor de servicios SAN pueda indicar a un par remoto que acepta o rechaza la solicitud de conexión del mismo nivel remoto, el proveedor de servicios SAN debe llamar a la función de condición del conmutador. Dependiendo del valor que devuelva la función de condición del conmutador, el proveedor de servicios SAN debe realizar una de las siguientes indicaciones al mismo nivel remoto:
Si la función de condición del modificador devuelve CF_ACCEPT, el proveedor de servicios SAN debe indicar que acepta la solicitud de conexión del mismo nivel remoto. El proveedor de servicios SAN del mismo nivel remoto puede completar correctamente su operación de conexión iniciada por una llamada de WSPConnect .
Si la función de condición del conmutador devuelve CF_REJECT, el proveedor de servicios SAN debe indicar que rechaza la solicitud de conexión del mismo nivel remoto. El proveedor de servicios SAN del mismo nivel remoto debe producir un error en su operación de conexión iniciada por una llamada WSPConnect con el código de error WSAECONNREFUSED.
Negociación de sesión
Una vez que el modificador ha usado correctamente un proveedor de servicios SAN para aceptar una solicitud de conexión de un mismo nivel remoto, el conmutador negocia una sesión con ese mismo nivel.
Para negociar una sesión
El modificador del mismo nivel remoto llama a la función WSPRecv del proveedor de servicios SAN para publicar un conjunto de búferes de recepción.
El modificador del mismo nivel remoto llama a la función WSPSend del proveedor de servicios SAN para enviar un mensaje de negociación de sesión al modificador en el punto de conexión de aceptación local. Este mensaje incluye el número de búferes de recepción que el conmutador del mismo nivel remoto ha publicado.
El modificador en el punto de conexión de aceptación local llama a la función WSPRecv del proveedor de servicios SAN local para publicar sus propios búferes de recepción, pero es posible que no pueda hacerlo a tiempo para recibir el mensaje de negociación de sesión. Si el conmutador local no publica un búfer de recepción en el tiempo y si la NIC subyacente no admite el control de flujo, el proveedor de servicios SAN en el punto de conexión de aceptación local debe almacenar en búfer el mensaje de negociación de sesión del conmutador remoto en sus propios búferes de recepción privados. Cuando el conmutador envía búferes de recepción, el proveedor de servicios SAN copia los datos de sus búferes de recepción privados en los búferes de conmutador de una a una base hasta que todos los datos se hayan copiado de los búferes privados en los búferes del conmutador.
El proveedor de servicios SAN realiza el procesamiento de recepción normal en los búferes de conmutador posteriores, es decir, publica todos estos búferes de conmutadores en la cola de recepción en la NIC.
Tenga en cuenta que un proveedor de servicios SAN no debe quitar una conexión simplemente porque el modificador no posteó un búfer de recepción antes de que llegara el mensaje de negociación de sesión. La longitud máxima de un mensaje de negociación de sesión es de 256 bytes.
El modificador en el punto de conexión de aceptación local publica sus búferes de recepción antes de responder al mensaje de negociación de sesión. El conmutador local llama a la función WSPSend del proveedor de servicios SAN local para responder al mensaje de negociación de sesión. La respuesta del conmutador local incluye el número de búferes de recepción que publicó el conmutador local. A partir de este momento, el conmutador local garantiza que el conjunto publicado de búferes de recepción es de tamaño suficiente para recibir cualquier mensaje que llegue a la conexión.
Si una aplicación especifica un búfer de recepción inicial en su llamada AcceptEx , el modificador espera hasta que recibe el primer mensaje de datos de su par remoto antes de completar la llamada AcceptEx de la aplicación.
Si la aplicación cancela su propia llamada de aceptación , el modificador llama a la función WSPCloseSocket del proveedor de servicios SAN adecuada para cerrar el socket SAN que acepta.