Uso compartido de direcciones de transporte
En la mayoría de las situaciones, una aplicación Winsock Kernel (WSK) no puede enlazar un socket a una dirección de transporte local que ya está en uso por otro socket. Las aplicaciones WSK pueden usar las opciones de socket SO_EXCLUSIVEADDRUSE y SO_REUSEADDR para controlar el uso compartido de la dirección de transporte local a la que está enlazado un socket. Ninguna de estas opciones de socket se establece para un socket de forma predeterminada. Para obtener más información sobre cómo establecer las opciones de socket, vea Realizar operaciones de control en un socket.
En la tabla siguiente se muestra el resultado de enlazar un segundo socket a una dirección de transporte local que ya está en uso por otro socket. Los casos comodín y Específicos especifican si el socket está enlazado a una dirección de transporte local con caracteres comodín o a una dirección de transporte local específica.
Segundo enlace | Primer enlace | ||||||
---|---|---|---|---|---|---|---|
Sin opciones de socket (valor predeterminado) |
SO_REUSEADDR |
SO_EXCLUSIVEADDRUSE |
|||||
Wildcard (Carácter comodín) |
Específico |
Wildcard (Carácter comodín) |
Específico |
Wildcard (Carácter comodín) |
Específico |
||
Sin opciones de socket (valor predeterminado) |
Wildcard (Carácter comodín) |
INUSE |
CORRECTA |
INUSE |
CORRECTA |
INUSE |
CORRECTA |
Específico |
CHECK |
INUSE |
CHECK |
NEGADO |
NEGADO |
INUSE |
|
SO_REUSEADDR |
Wildcard (Carácter comodín) |
NEGADO |
CORRECTA |
CORRECTA |
CORRECTA |
NEGADO |
CORRECTA |
Específico |
CHECK |
NEGADO |
CORRECTA |
CORRECTA |
NEGADO |
NEGADO |
|
SO_EXCLUSIVEADDRUSE |
Wildcard (Carácter comodín) |
INUSE |
INUSE |
INUSE |
INUSE |
INUSE |
INUSE |
Específico |
CHECK |
INUSE |
CHECK |
INUSE |
NEGADO |
INUSE |
Los resultados se definen de la siguiente manera:
ÉXITO
La operación de enlace para el segundo socket se realiza correctamente. El subsistema WSK devuelve un estado de STATUS_SUCCESS.
INUSE
Se produce un error en la operación de enlace en el segundo socket. El subsistema WSK devuelve un estado de STATUS_ADDRESS_ALREADY_EXISTS.
NEGADO
Se produce un error en la operación de enlace en el segundo socket. El subsistema WSK devuelve un estado de STATUS_ACCESS_DENIED.
CHECK
Se realiza una comprobación de acceso para determinar si la operación de enlace en el segundo socket se realiza correctamente o se produce un error. Si se concede acceso, el enlace se realiza correctamente y el subsistema WSK devuelve un estado de STATUS_SUCCESS. Si se deniega el acceso, se produce un error en el enlace y el subsistema WSK devuelve un estado de STATUS_ACCESS_DENIED.
En los casos definidos en la tabla anterior donde se realiza una comprobación de acceso, el segundo contexto de seguridad del socket se comprueba con el descriptor de seguridad del primer socket.
El contexto de seguridad de un socket viene determinado por los parámetros OwningProcess y OwningThread que se pasan a la función WskSocket o a la función WskSocketConnect cuando se crea el socket. Si no se especifica ningún proceso o subproceso específico cuando se crea el socket, se usa el contexto de seguridad del proceso que creó el socket.
El descriptor de seguridad de un socket se especifica mediante el parámetro SecurityDescriptor que se pasa a la función WskSocket o a la función WskSocketConnect cuando se crea el socket. Si no se especifica ningún descriptor de seguridad específico, el subsistema WSK usa un descriptor de seguridad predeterminado que no permite el uso compartido de direcciones de transporte. También se puede aplicar un descriptor de seguridad a un socket una vez creado el socket mediante la opción de socket SO_WSK_SECURITY .
Si los dos sockets están enlazados a dos direcciones de transporte locales específicas diferentes, no se comparte ninguna dirección de transporte. En esta situación, la segunda operación de enlace siempre se completará correctamente.