Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 |
|---|---|
| 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ç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 . |
|
| 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 level é desconhecido ou inválido. Este erro também é retornado se o soquete já estava em um estado de escuta. |
|
| A opção é desconhecida ou não é suportada pela 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 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 |
|
Consulte também