Compartir a través de


Función WSADuplicateSocketA (winsock2.h)

La función WSADuplicateSocket devuelve una estructura de WSAPROTOCOL_INFO que se puede usar para crear un nuevo descriptor de socket para un socket compartido. La función WSADuplicateSocket no se puede usar en un socket habilitado para QOS.

Sintaxis

int WSAAPI WSADuplicateSocketA(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);

Parámetros

[in] s

Descriptor que identifica el socket local.

[in] dwProcessId

Identificador de proceso del proceso de destino en el que se usará el socket duplicado.

[out] lpProtocolInfo

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

Valor devuelto

Si no se produce ningún error, WSADuplicateSocket devuelve cero. De lo contrario, se devuelve un valor de SOCKET_ERROR y se puede recuperar un código de error específico llamando a WSAGetLastError.

Código de error Significado
WSANOTINITIALISED
Se debe realizar una llamada de WSAStartup correcta antes de usar esta función.
WSAENETDOWN
Error en el subsistema de red.
WSAEINVAL
Indica que uno de los parámetros especificados no era válido.
WSAEINPROGRESS
Una llamada de Bloqueo de Windows Sockets 1.1 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 de búfer disponible. No se puede crear el socket.
WSAENOTSOCK
El descriptor no es un socket.
WSAEFAULT
El parámetro lpProtocolInfo no es una parte válida del espacio de direcciones del usuario.

Observaciones

La función WSADuplicateSocket se usa para habilitar el uso compartido de sockets entre procesos. Un proceso de origen llama a WSADuplicateSocket para obtener una estructura de 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 WSASocket para obtener un descriptor para el socket duplicado. El proceso de destino solo puede usar la estructura WSAPROTOCOL_INFO especial una vez.

Los sockets se pueden compartir entre subprocesos en un proceso determinado sin usar el WSADuplicateSocket función porque un descriptor de socket es válido en todos los subprocesos de un proceso.

En la tabla siguiente se muestra un escenario posible para establecer y entregar un socket compartido.

Proceso de origen IPC Proceso de destino
1) WSASocket, WSAConnect
2) Identificador de proceso de destino de solicitud ==>
3) Recibir solicitud de identificador de proceso y responder
4) Identificador de proceso de recepción <==
5) Llame a WSADuplicateSocket para obtener una estructura de WSAPROTOCOL_INFO especial
6) Enviar WSAPROTOCOL_INFO estructura al destino
==> 7) Estructura de WSAPROTOCOL_INFO de recepción
8) Llame a WSASocket para crear un descriptor de socket compartido.
9) Uso del socket compartido para el intercambio de datos
10) closesocket <==
 

Los descriptores que hacen referencia a un socket compartido se pueden usar de forma independiente para 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. Los sockets compartidos suelen usarse para tener un proceso responsable de crear sockets y establecer conexiones, y otros procesos responsables del intercambio de información.

Toda la información de estado asociada a un socket se mantiene en común en todos los descriptores porque los descriptores de socket están duplicados y no el socket real. Por ejemplo, una operación setockopt realizada mediante un descriptor se puede ver posteriormente mediante un getockopt desde cualquiera o todos los descriptores. Tanto el proceso de origen como el proceso de destino deben pasar las mismas marcas a sus respectivas llamadas de función WSASocket. Si el proceso de origen usa la función de socket para crear el socket, el proceso de destino debe pasar la marca de WSA_FLAG_OVERLAPPED a su llamada de función WSASocket. Un proceso puede llamar a closesocket en un socket duplicado y el descriptor se desasignará. Sin embargo, el socket subyacente permanecerá abierto hasta que el último descriptor restante llame a closesocket.

La notificación en sockets compartidos está sujeta a las restricciones habituales de WSAAsyncSelect y WSAEventSelect. 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, un socket compartido no puede entregar eventos FD_READ para procesar eventos A y FD_WRITE para procesar B. En situaciones en las que se requiere una coordinación estrecha, se recomienda a los desarrolladores usar subprocesos en lugar de procesos independientes.

windows 8.1 y Windows Server 2012 R2: la función WSADuplicateSocketW es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.

Nota

El encabezado winsock2.h define WSADuplicateSocket como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Conventions for Function Prototypes.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
servidor mínimo admitido Windows Server 2003 [aplicaciones de escritorio | Aplicaciones para UWP]
de la plataforma de destino de Windows
encabezado de winsock2.h
biblioteca de Ws2_32.lib
DLL de Ws2_32.dll

Consulte también

WSASocket

funciones winsock

de referencia de Winsock