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 |
---|---|
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função. |
|
O subsistema de rede falhou. |
|
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 . |
|
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. |
|
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. |
|
A opção é desconhecida ou sem suporte da família de protocolos indicada. |
|
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 |
|
Confira também