Compartilhar 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 deseja ou não aceitar uma conexão de entrada em um soquete de escuta.

Valor da opção 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 [in]

Um descritor que identifica o soquete.

level [in]

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

optname [in]

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

optval [out]

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

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

optlen [in, out]

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 retornado

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 do erro Significado
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ço do usuário. Esse erro também será retornado se o valor apontado pelo parâmetro optlen for menor que o tamanho de um valor DWORD .
WSAEINPROGRESS
Uma chamada do Windows Sockets 1.1 de bloqueio está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEINVAL
O parâmetro de nível é desconhecido ou inválido. Esse erro também será retornado se o soquete já estiver em um estado de escuta.
WSAENOPROTOOPT
A opção é desconhecida ou sem suporte da família de protocolos indicada.
WSAENOTSOCK
O descritor não é um soquete.

 

Comentários

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 desabilita as defesas de proteção de ataque SYN internas da pilha TCP, já que o aplicativo agora está assumindo a propriedade de aceitar conexões.
  • Isso desabilita efetivamente a lista de pendências de escuta, pois 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 de 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 poderá atingir o tempo limite antes que o aplicativo realmente aceite a conexão. Isso leva a uma experiência de cliente ruim.

Geralmente, o main motivo pelo 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 funcionem 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 manipula a conexão aceita, se for de um endereço de origem ip inadequado ou porta, 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, pois fechou a conexão aceita com força. No entanto, as desvantagens de habilitar 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 normalmente não seja 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 em Winsock2.h e nunca deve ser usado diretamente.

Requisitos

Requisito Valor
Cliente mínimo com suporte
Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte
Windows Server 2008 [somente aplicativos da área de trabalho]
Cabeçalho
Ws2def.h (inclua Winsock2.h)

Confira também

Getsockopt

Setsockopt

Wsaaccept