Función de devolución de llamada LPWSPDUPLICATESOCKET (ws2spi.h)

La función LPWSPDuplicateSocket devuelve una estructura de WSAPROTOCOL_INFO que se puede usar para crear un nuevo descriptor de socket para un socket compartido.

Sintaxis

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

Parámetros

[in] s

Descriptor de socket local.

[in] dwProcessId

Identificador del proceso de destino para el que se usará el socket compartido.

[out] lpProtocolInfo

Puntero a un búfer asignado por el cliente que es lo suficientemente grande como para contener una estructura de WSAPROTOCOL_INFO . El proveedor de servicios copia el contenido de la estructura de la información del protocolo en este búfer.

[out] lpErrno

Puntero al código de error.

Valor devuelto

Si no se produce ningún error, LPWSPDuplicateSocket devuelve cero. De lo contrario, se devuelve el valor de SOCKET_ERROR y hay disponible un número de error específico en lpErrno.

Código de error Significado
WSAENETDOWN
Error en el subsistema de red.
WSAEINVAL
Indica que uno de los parámetros especificados no era válido.
WSAEINPROGRESS
El bloqueo de la llamada a Windows Sockets está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAEMFILE
No hay más descriptores de socket disponibles.
WSAENOBUFS
No hay espacio disponible en el búfer. El socket no se puede crear.
WSAENOTSOCK
El descriptor no es un socket.

Observaciones

Un proceso de origen llama a LPWSPDuplicateSocket para obtener una estructura WSAPROTOCOL_INFO especial. Usa algún mecanismo de comunicaciones entre procesos (IPC) para pasar el contenido de esta estructura a un proceso de destino, que a su vez lo usa en una llamada a LPWSPSocket para obtener un descriptor para el socket duplicado. Tenga en cuenta que el proceso de destino solo puede usar la estructura WSAPROTOCOL_INFO especial una vez.

Es responsabilidad del proveedor de servicios realizar las operaciones necesarias en el contexto del proceso de origen y crear una estructura de WSAPROTOCOL_INFO que se reconocerá cuando aparezca posteriormente como parámetro para LPWSPSocket en el contexto de los procesos de destino. A continuación, el proveedor debe devolver un descriptor de socket que haga referencia a un socket subyacente común. El miembro dwProviderReserved de la estructura WSAPROTOCOL_INFO está disponible para el uso del proveedor de servicios y se puede usar para almacenar cualquier información de contexto útil, incluido un identificador duplicado.

Cuando se asigna un nuevo descriptor de socket, un proveedor de sistema de archivos instalable (IFS) debe llamar a WPUModifyIFSHandle y un proveedor que no sea IFS debe llamar a WPUCreateSocketHandle. Un proveedor IFS puede usar la función DuplicateHandle . Para garantizar la correcta ejecución de la duplicación de sockets, un proveedor de servicios que no sea IFS debe usar la función LPWSPDuplicateSocket .

En el siguiente ejemplo se muestra un escenario posible para establecer y usar un socket compartido en modo de entrega.

Proceso de origen IPC Significado
1) LPWSPSocket, LPWSPConnect
2) Solicita el identificador de proceso de destino.
==>
3) Recibe la solicitud de identificador de proceso y responde.
4) Recibe el identificador de proceso.
<==
5) Llama a **LPWSPDuplicateSocket** para obtener una estructura de WSAPROTOCOL_INFO especial.
6) Envía WSAPROTOCOL_INFO estructura al destino.
==> 7) Recibe WSAPROTOCOL_INFO estructura.
8) Llama a LPWSPSocket para crear un descriptor de socket compartido.
9) Usa socket compartido para el intercambio de datos.
10) LPWSPCloseSocket
<==

Los descriptores que hacen referencia a un socket compartido se pueden usar de forma independiente en lo que respecta a la E/S. Sin embargo, la interfaz de Windows Sockets no implementa ningún tipo de control de acceso, por lo que depende de los procesos implicados coordinar sus operaciones en un socket compartido. Un uso típico de sockets compartidos es tener un proceso responsable de crear sockets y establecer conexiones, entregar sockets a otros procesos responsables del intercambio de información.

Dado que lo que se duplica son los descriptores de socket y no el socket subyacente, todos los estados asociados a un socket se mantienen en común en todos los descriptores. Por ejemplo, una operación WSPSetSockSockOpt realizada mediante un descriptor es visible posteriormente mediante un LPWSPGetSockopt desde cualquiera o todos los descriptores. Un proceso puede llamar a LPWSPCloseSocket en un socket duplicado y el descriptor se desasignará. Sin embargo, el socket subyacente permanecerá abierto hasta que el último descriptor restante llame a LPWSPClosesocket .

La notificación en sockets compartidos está sujeta a las restricciones habituales de LPWSPAsyncSelect y LPWSPEventSelect. La emisión de cualquiera de estas llamadas mediante cualquiera de los descriptores compartidos cancela cualquier registro de eventos anterior para el socket, independientemente del descriptor que se usó para realizar ese registro. Por lo tanto, por ejemplo, un socket compartido no puede entregar eventos de FD_READ para procesar los eventos A y FD_WRITE para procesar B. En situaciones en las que se requiere una coordinación estrecha, se recomienda que los desarrolladores usen subprocesos en lugar de procesos independientes.

Un proveedor de servicios en capas proporciona una implementación de esta función, pero también es un cliente de esta función si y cuando llama a LPWSPDuplicateSocket de la siguiente capa de la cadena de protocolos. Algunas consideraciones especiales se aplican al parámetro lpProtocolInfo de esta función, ya que se propaga a través de las capas de la cadena de protocolos.

Si la siguiente capa de la cadena de protocolos es otra capa, cuando se llama al LPWSPDuplicateSocket de la capa siguiente, esta capa debe pasar a la siguiente capa un lpProtocolInfo que haga referencia a la misma estructura de WSAPROTOCOL_INFO sin modificar con la misma información de cadena sin modificar. Sin embargo, si la capa siguiente es el protocolo base (es decir, el último elemento de la cadena), esta capa realiza una sustitución al llamar al LPWSPDuplicateSocket del proveedor base. En este caso, el parámetro lpProtocolInfo debe hacer referencia a la estructura WSAPROTOCOL_INFO del proveedor base.

Una ventaja fundamental de esta directiva es que los proveedores de servicios base no tienen que ser conscientes de las cadenas de protocolos. Esta misma directiva se aplica al propagar una estructura de WSAPROTOCOL_INFO a través de una secuencia por capas de otras funciones, como LPWSPAddressToString, WSPStartup, LPWSPSocket o LPWSPStringToAddress.

Requisitos

   
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Encabezado ws2spi.h

Consulte también

WPUCreateSocketHandle

WPUModifyIFSHandle