Compartir a través de


Asignación de descriptores

Aunque se recomienda a los proveedores de servicios de Windows Sockets implementar sockets como objetos del sistema de archivos instalables (IFS), la arquitectura winsock también admite proveedores de servicios cuyos identificadores de socket no son objetos IFS. Los proveedores con identificadores IFS indican esto a través del bit de atributo XP1_IFS_HANDLES en la estructura de WSAPROTOCOL_INFO . (Nota: el bit de atributo XP1_IFS_HANDLES no se incluyó en la versión 2.0.8 de la especificación de la API, pero desde entonces se ha agregado a través del mecanismo errata). Los clientes SPI de Winsock pueden aprovechar los proveedores cuyos descriptores de socket son identificadores IFS mediante estos descriptores con instalaciones estándar de E/S de Windows, como ReadFile y WriteFile.

Siempre que un proveedor IFS crea un nuevo descriptor de socket, es obligatorio que el proveedor llame a WPUModifyIFSHandle antes de proporcionar el nuevo identificador a un cliente SPI de Windows Sockets. Esta función toma un identificador de proveedor y un identificador IFS propuesto del proveedor como entrada y devuelve un identificador modificado (posiblemente). El proveedor IFS solo debe proporcionar el identificador modificado a su cliente y todas las solicitudes del cliente solo harán referencia a este identificador modificado. Se garantiza que el identificador modificado sea indistinguible del identificador propuesto en lo que respecta al sistema operativo. Por lo tanto, en la mayoría de los casos, el proveedor de servicios simplemente elegirá usar solo el identificador modificado en todo su procesamiento interno. El propósito de esta función de modificación es permitir que el Ws2_32.dll optimice considerablemente el proceso de identificación del proveedor de servicios asociado a un socket determinado.

Los proveedores que no devuelven identificadores IFS deben obtener un identificador válido del Ws2_32.dll a través de la llamada WPUCreateSocketHandle . El proveedor que no es DEIFS solo debe ofrecer un identificador proporcionado por Windows Sockets 2.DLL a su cliente, y todas las solicitudes del cliente solo harán referencia a estos identificadores. Como comodidad para los implementadores de proveedores de servicios, uno de los parámetros de entrada proporcionados por un proveedor en WPUCreateSocketHandle es un valor de contexto DWORD. El Ws2_32.dll asocia este valor de contexto con el identificador de socket asignado y permite a un proveedor de servicios recuperar el valor de contexto en cualquier momento a través de la llamada WPUQuerySocketHandleContext . Un uso típico para este valor de contexto sería almacenar un puntero a una estructura de datos mantenida por el proveedor de servicios utilizada para almacenar información de estado de socket.