Función WSADuplicateSocketA (winsock2.h)
La función
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 |
---|---|
Se debe realizar una llamada de WSAStartup correcta |
|
Error en el subsistema de red. | |
Indica que uno de los parámetros especificados no era válido. | |
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. | |
No hay más descriptores de socket disponibles. | |
No hay espacio de búfer disponible. No se puede crear el socket. | |
El descriptor no es un socket. | |
El parámetro lpProtocolInfo no es una parte válida del espacio de direcciones del usuario. |
Observaciones
La función
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
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 |