Finalización de solicitudes de transferencia de datos
El conmutador Windows Sockets transfiere datos en un socket SAN de forma asincrónica. Cada vez que el modificador llama a la función de transferencia de datos WSPSend, WSPRecv, WSPRdmaWrite o WSPRdmaRead , especifica un puntero a una estructura superpuesta (WSAOVERLAPPED) y NULL para una rutina de finalización. Incluso si el modificador llama a la función WSPEventSelect del proveedor de servicios SAN para indicar que el socket está en modo de bloqueo, el proveedor de servicios SAN no es necesario para implementar la semántica de bloqueo para estas funciones de transferencia de datos.
Como se describe en la documentación de LA API de Windows Sockets y SPI en la documentación de Microsoft Windows SDK, los sockets de bloqueo y no bloqueo tratan las mismas operaciones superpuestas. Es decir, el proveedor de servicios SAN inicia la operación de transferencia de datos determinada y, a continuación, devuelve inmediatamente el control al conmutador. Estas funciones de transferencia de datos devuelven código de error WSA_IO_PENDING para indicar que se inició una operación asincrónica y que la finalización de esa operación se produce más adelante. Una vez completada la operación, el proveedor de servicios SAN señala la finalización si el modificador requiere la notificación de finalización, tal como se describe en los párrafos siguientes.
Dado que el modificador siempre especifica NULL para una rutina de finalización para las operaciones de transferencia de datos superpuestas, no es necesario que un proveedor de servicios SAN admita la finalización mediante el uso de llamadas a procedimientos asincrónicos (API).
Siempre que sea posible, el modificador intenta llamar a la función WSPGetOverlappedResult del proveedor de servicios SAN para sondear la finalización de solicitudes de transferencia de datos. De esta manera, el modificador puede evitar la sobrecarga asociada a los mecanismos de finalización superpuestos activos. Para indicar a un proveedor de servicios SAN que el modificador no requiere una notificación de finalización para una operación de transferencia de datos superpuesta determinada, el modificador establece el bit de orden bajo del miembro hEvent en la estructura WSAOVERLAPPED en uno. El proveedor de servicios SAN no debe notificar al modificador la finalización de las solicitudes enviadas de esta manera.
Si el modificador requiere la notificación de la finalización de una operación de transferencia de datos superpuesta, establece el bit de orden bajo del miembro hEvent en la estructura WSAOVERLAPPED en cero. El proveedor de servicios SAN debe completar las operaciones de transferencia de datos que se inician de esta manera mediante una llamada a la función WPUCompleteOverlappedRequest para indicar la finalización. En esta llamada, el proveedor de servicios SAN pasa un puntero a la estructura WSAOVERLAPPED que corresponde a una operación de transferencia de datos completada. En esta llamada WPUCompleteOverlappedRequest , el proveedor de servicios SAN también pasa el descriptor de socket que se adquirió del modificador en una llamada a la función WPUCreateSocketHandle . El modificador recibe notificaciones de finalización, las coincide con las solicitudes de E/S de una aplicación y completa esas solicitudes de E/S, según corresponda, para la aplicación.