Share via


SO_CONDITIONAL_ACCEPT opción de socket

La opción de socket SO_CONDITIONAL_ACCEPT está diseñada para permitir que una aplicación decida si aceptar o no una conexión entrante en un socket de escucha.

Valor de opción de socket

La constante que representa esta opción de socket es 0x3002.

Sintaxis

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

Parámetros

s [in]

Descriptor que identifica el socket.

level [in]

Nivel en el que se define la opción. Use SOL_SOCKET para esta operación.

optname [in]

Opción de socket para la que se va a establecer el valor. Use SO_CONDITIONAL_ACCEPT para esta operación.

optval [out]

Puntero al búfer que contiene el valor de la opción que se va a establecer. Este parámetro debe apuntar al búfer igual o mayor que el tamaño de un valor DWORD .

Este valor se trata como un valor booleano con 0 que se usa para indicar FALSE (deshabilitado) y un valor distinto de cero para indicar TRUE (habilitado).

optlen [in, out]

Puntero al tamaño, en bytes, del búfer optval . Este tamaño debe ser igual o mayor que el tamaño de un valor DWORD .

Valor devuelto

Si la operación se completa correctamente, setsockopt devuelve cero.

Si se produce un error en la operación, 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.
WSAEFAULT
Uno de los parámetros optval o optlen apunta a la memoria que no está en una parte válida del espacio de direcciones del usuario. Este error también se devuelve si el valor al que apunta el parámetro optlen es menor que el tamaño de un valor DWORD .
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.
WSAEINVAL
El parámetro level es desconocido o no válido. Este error también se devuelve si el socket ya estaba en un estado de escucha.
WSAENOPROTOOPT
La opción es desconocida o no admitida por la familia de protocolos indicada.
WSAENOTSOCK
El descriptor no es un socket.

 

Comentarios

La función setsockopt llamada con la opción de socket SO_CONDITIONAL_ACCEPT permite a una aplicación decidir si aceptar o no una conexión entrante en un socket de escucha. La opción de aceptación condicional para un socket está deshabilitada (establecida en FALSE) de forma predeterminada.

Cuando esta opción de socket está habilitada, la pila TCP no acepta automáticamente las conexiones. Espera a que la aplicación indique que acepta la conexión a través de la devolución de llamada de aceptación condicional registrada con la función WSAAccept . Una vez recibida una solicitud de conexión, Winsock invoca la devolución de llamada de aceptación condicional registrada por la aplicación. Solo cuando la devolución de llamada de aceptación condicional devuelve CF_ACCEPT winsock notificará al transporte para aceptar completamente la conexión.

Cuando la opción de socket SO_CONDITIONAL_ACCEPT está establecida en habilitada (establecida en TRUE), esto tiene varios efectos secundarios en el socket:

  • Esto deshabilita las defensas integradas de protección contra ataques SYN de la pila TCP, ya que la aplicación ahora toma posesión de la aceptación de conexiones.
  • Esto deshabilita eficazmente el trabajo pendiente de escucha, ya que las conexiones no se aceptan en nombre de un socket de escucha. Una conexión nunca se acepta completamente hasta que la aplicación acepta completamente el uso del mecanismo de CF_ACCEPT .
  • Esto también significa que la aplicación se encarga siempre de estar en un estado para controlar fácilmente las devoluciones de llamada de aceptación para aceptar la conexión. Si la aplicación está ocupada realizando otro procesamiento, el lado cliente puede agotar el tiempo de espera antes de que la aplicación acepte realmente la conexión. Esto conduce a una experiencia de cliente deficiente.

Por lo general, la razón principal por la que las aplicaciones usan la aceptación condicional es inspeccionar la dirección IP de origen o el puerto usado por el cliente de conexión y, a continuación, decidir aceptar o rechazar la conexión. Sin embargo, es probable que las aplicaciones funcionen mejor si la opción SO_CONDITIONAL_ACCEPT no está habilitada y la aplicación permite que la pila TCP y el trabajo pendiente de escucha funcionen según lo previsto. Después, cuando la aplicación controla la conexión aceptada, si procede de una dirección de origen o puerto IP incorrecta, la aplicación puede cerrar el socket. El inconveniente de seguridad de este comportamiento es que ahora el cliente tiene la confirmación de que la aplicación está escuchando en una dirección IP y un puerto, ya que cerró forzadamente la conexión aceptada anteriormente. Sin embargo, los inconvenientes de habilitar SO_CONDITIONAL_ACCEPT generalmente superan esta limitación.

La función getockopt llamada con la opción de socket SO_CONDITIONAL_ACCEPT permite a una aplicación recuperar el estado actual de la opción de aceptación condicional, aunque esta característica no se usa normalmente. Si una aplicación necesita habilitar la aceptación condicional en un socket, solo llama a la función setsockopt para habilitar la opción.

Tenga en cuenta que el archivo de encabezado Ws2def.h se incluye automáticamente en Winsock2.h y nunca se debe usar directamente.

Requisitos

Requisito Value
Cliente mínimo compatible
Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2008 [solo aplicaciones de escritorio]
Encabezado
Ws2def.h (incluya Winsock2.h)

Consulte también

getsockopt

setsockopt

WSAAccept