Función WSADuplicateSocketW (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 WSADuplicateSocketW(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOW 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 la 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
Debe producirse 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 disponible en el búfer. El socket no se puede crear.
WSAENOTSOCK
El descriptor no es un socket.
WSAEFAULT
El parámetro lpProtocolInfo no es una parte válida del espacio de direcciones del usuario.

Comentarios

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 la función WSADuplicateSocket 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) Usar 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 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. Los sockets compartidos se suelen usar 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 setsockopt realizada con un descriptor se ve posteriormente mediante un getockopt de 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 de WSASocket . Si el proceso de origen usa la función socket para crear el socket, el proceso de destino debe pasar la marca 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 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 neutro de codificación con código que no es neutral de codificación puede provocar discrepancias que dan lugar a errores de compilación o en tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado winsock2.h
Library Ws2_32.lib
Archivo DLL Ws2_32.dll

Consulte también

WSASocket

Funciones winsock

Referencia de Winsock