Partilhar via


SO_CONDITIONAL_ACCEPT opção de soquete

A opção de soquete SO_CONDITIONAL_ACCEPT foi projetada para permitir que um aplicativo decida se aceita ou não uma conexão de entrada em um soquete de escuta.

Valor da opção de soquete

A constante que representa essa opção de soquete é 0x3002.

Sintaxe

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 [em]

Um descritor que identifica o soquete.

nível [in]

O nível em que a opção é definida. Use SOL_SOCKET para esta operação.

optname [em]

A opção de soquete para a qual o valor deve ser definido. Use SO_CONDITIONAL_ACCEPT para esta operação.

optval [saída]

Um ponteiro para o buffer que contém o valor para a opção a definir. Esse parâmetro deve apontar para buffer igual ou maior que o tamanho de um valor DWORD .

Esse valor é tratado como um valor booleano com 0 usado para indicar FALSE (desabilitado) e um valor diferente de zero para indicar TRUE (habilitado).

optlen [entrada, saída]

Um ponteiro para o tamanho, em bytes, do buffer optval . Esse tamanho deve ser igual ou maior que o tamanho de um valor DWORD .

Valor de retorno

Se a operação for concluída com êxito, setsockopt retornará zero.

Se a operação falhar, um valor de SOCKET_ERROR será retornado e um código de erro específico poderá ser recuperado chamando WSAGetLastError.

Código de erro Meaning
WSANOTINITIALISED
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função.
WSAENETDOWN
O subsistema de rede falhou.
WSAEFAULT
Um dos parâmetros optval ou optlen apontam para a memória que não está em uma parte válida do espaço de endereçamento do usuário. Este erro também é retornado se o valor apontado pelo parâmetro optlen for menor que o tamanho de um valor DWORD .
WSAEINPROGRESS
Uma chamada de bloqueio do Windows Sockets 1.1 está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEINVAL
O parâmetro level é desconhecido ou inválido. Este erro também é retornado se o soquete já estava em um estado de escuta.
WSAENOPROTOOPT
A opção é desconhecida ou não é suportada pela família de protocolos indicada.
WSAENOTSOCK
O descritor não é um soquete.

 

Observações

A função setsockopt chamada com a opção de soquete SO_CONDITIONAL_ACCEPT permite que um aplicativo decida se aceita ou não uma conexão de entrada em um soquete de escuta. A opção de aceitação condicional para um soquete está desabilitada (definida como FALSE) por padrão.

Quando essa opção de soquete está habilitada, a pilha TCP não aceita conexões automaticamente. Ele aguarda que o aplicativo indique que aceita a conexão por meio do retorno de chamada de aceitação condicional registrado com a função WSAAccept . Depois que uma solicitação de conexão é recebida, Winsock invoca o retorno de chamada de aceitação condicional registrado pelo aplicativo. Somente quando o retorno de chamada de aceitação condicional retornar CF_ACCEPT Winsock notificará o transporte para aceitar totalmente a conexão.

Quando a opção de soquete SO_CONDITIONAL_ACCEPT é definida como habilitada (definida como TRUE), isso tem vários efeitos colaterais no soquete:

  • Isso desativa as defesas internas de proteção contra ataques SYN da pilha TCP, uma vez que o aplicativo agora está assumindo a responsabilidade de aceitar conexões.
  • Isso efetivamente desativa a lista de pendências de escuta, uma vez que as conexões não são aceitas em nome de um soquete de escuta. Uma conexão nunca é totalmente aceita até que o aplicativo aceite totalmente o uso do mecanismo CF_ACCEPT .
  • Isso também significa que o aplicativo tem o cuidado de estar sempre em um estado para lidar prontamente com os retornos de chamada de aceitação para aceitar a conexão. Se o aplicativo estiver ocupado fazendo outro processamento, o lado do cliente pode atingir o tempo limite antes que o aplicativo realmente aceite a conexão. Isso leva a uma má experiência do cliente.
  • Algumas otimizações de pilha TCP não se aplicam a conexões totalmente aceitas, mesmo após a conclusão da aceitação condicional. Isso pode reduzir o desempenho da conexão ao longo de toda a sua vida útil.

Geralmente, a principal razão pela qual os aplicativos usam aceitação condicional é inspecionar o endereço IP de origem ou a porta usada pelo cliente de conexão e, em seguida, decidir aceitar ou rejeitar a conexão. No entanto, é provável que os aplicativos tenham um desempenho melhor se a opção SO_CONDITIONAL_ACCEPT não estiver habilitada e o aplicativo permitir que a pilha TCP e a lista de pendências de escuta funcionem conforme o esperado. Em seguida, quando o aplicativo lida com a conexão aceita, se for de um endereço de origem IP ou porta imprópria, o aplicativo pode simplesmente fechar o soquete. A desvantagem de segurança para esse comportamento é que agora o cliente tem a confirmação de que o aplicativo está escutando em um endereço IP e porta, uma vez que fechou à força a conexão aceita anteriormente. No entanto, as desvantagens de permitir SO_CONDITIONAL_ACCEPT geralmente superam essa limitação.

A função getsockopt chamada com a opção de soquete SO_CONDITIONAL_ACCEPT permite que um aplicativo recupere o estado atual da opção de aceitação condicional, embora esse recurso não seja normalmente usado. Se um aplicativo precisar habilitar a aceitação condicional em um soquete, ele apenas chamará a função setsockopt para habilitar a opção.

Observe que o arquivo de cabeçalho Ws2def.h é incluído automaticamente no Winsock2.h e nunca deve ser usado diretamente.

Requerimentos

Requisito Valor
Cliente mínimo suportado
Windows Vista [apenas aplicações de ambiente de trabalho]
Servidor mínimo suportado
Windows Server 2008 [apenas aplicações de ambiente de trabalho]
Header
Ws2def.h (inclui Winsock2.h)

Consulte também

Getsockopt

Setsockopt

WSAAccept