Share via


Sockets compartidos

La función WSADuplicateSocket se introduce para habilitar el uso compartido de sockets entre procesos. Un proceso de origen llama a WSADuplicateSocket para obtener una estructura de WSAPROTOCOL_INFO especial para un identificador de proceso de destino. Usa algún mecanismo de comunicaciones entre procesos (IPC) para pasar el contenido de esta estructura a un proceso de destino. A continuación, el proceso de destino usa la estructura WSAPROTOCOL_INFO en una llamada a WSPSocket. El descriptor de socket devuelto por esta función será un descriptor de socket adicional para un socket subyacente que, por tanto, se comparte. 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.

Los dos descriptores (o más) 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 Winsock no implementa ningún tipo de control de acceso, por lo que los procesos deben coordinar las operaciones en un socket compartido. Un ejemplo típico de sockets de uso compartido es usar un proceso para crear sockets y establecer conexiones. A continuación, este proceso entrega sockets a otros procesos responsables del intercambio de información.

La función WSADuplicateSocket crea descriptores de socket y no el socket subyacente. Como resultado, todos los estados asociados a un socket se mantienen en común en todos los descriptores. Por ejemplo, una operación setsockopt realizada mediante un descriptor es visible posteriormente mediante un getockopt de cualquiera o todos los descriptores. Un proceso puede llamar a closesocket en un socket duplicado y el descriptor se desasignará. Sin embargo, el socket subyacente permanece abierto hasta que se llama a closesocket con el último descriptor restante.

La notificación en sockets compartidos está sujeta a las restricciones habituales de las funciones 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, por ejemplo, no sería posible que el proceso A reciba eventos FD_READ y procese los eventos de recepción B FD_WRITE. En situaciones en las que se requiere una coordinación estrecha, se recomienda que los desarrolladores usen subprocesos en lugar de procesos independientes.