Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 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 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 do erro | Meaning |
|---|---|
| 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 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. |
|
| 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. |
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 de 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 SO_CONDITIONAL_ACCEPT soquete é 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 efetivamente desabilita o backlog 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.
- 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 durante todo o tempo de vida.
Geralmente, o principal 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 o backlog de escuta funcionem conforme o esperado. Em seguida, quando o aplicativo manipula a conexão aceita, se ela for de um endereço ip inadequado ou porta, o aplicativo poderá 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 com força a conexão aceita anteriormente. 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 no Winsock2.h e nunca deve ser usado diretamente.
Requirements
| Requirement | Value |
|---|---|
| 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] |
| Header |
|
Consulte também