LPFN_DISCONNECTEX função de retorno de chamada (mswsock.h)
A função DisconnectEx fecha uma conexão em um soquete e permite que o identificador de soquete seja reutilizado.
Observação
Essa função é uma extensão específica da Microsoft para a especificação do Windows Sockets.
Sintaxe
LPFN_DISCONNECTEX LpfnDisconnectex;
BOOL LpfnDisconnectex(
SOCKET s,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags,
DWORD dwReserved
)
{...}
Parâmetros
s
Um identificador para um soquete conectado orientado à conexão.
lpOverlapped
Um ponteiro para uma estrutura OVERLAPPED. Se o identificador de soquete tiver sido aberto como sobreposto, especificar esse parâmetro resultará em uma operação de E/S sobreposta (assíncrona).
dwFlags
Um conjunto de sinalizadores que personaliza o processamento da chamada de função. Quando esse parâmetro é definido como zero, nenhum sinalizador é definido. O parâmetro dwFlags pode ter o valor a seguir.
Sinalizador | Significado |
---|---|
TF_REUSE_SOCKET | Prepara o identificador de soquete a ser reutilizado. Quando a solicitação DisconnectEx for concluída, o identificador de soquete poderá ser passado para a função AcceptEx ou ConnectEx . Nota: A desconexão no nível do soquete está sujeita ao comportamento do transporte subjacente. Por exemplo, um soquete TCP pode estar sujeito ao estado de TIME_WAIT TCP, fazendo com que a chamada DisconnectEx seja atrasada. |
dwReserved
Reservado. Deve ser zero. Se não zero, WSAEINVAL será retornado.
Retornar valor
Em caso de êxito , a função DisconnectEx retorna TRUE. Em caso de falha, a função retorna FALSE. Use a função WSAGetLastError para obter informações de erro estendidas. Se uma chamada para a função WSAGetLastError retornar ERROR_IO_PENDING, a operação foi iniciada com êxito e está em andamento. Nessas circunstâncias, a chamada ainda poderá falhar quando a operação for concluída.
Código do erro | Descrição |
---|---|
WSAEFAULT | O sistema detectou um endereço de ponteiro inválido ao tentar usar um argumento de ponteiro. Esse erro será retornado se um valor de ponteiro inválido for passado no parâmetro lpOverlapped . |
WSAEINVAL | O parâmetro inválido foi passado. Esse erro será retornado se o parâmetro dwFlags tiver sido especificado com um valor zero diferente de TF_REUSE_SOCKET. |
WSAENOTCONN | O soquete não está conectado. Esse erro será retornado se o parâmetro do soquete não estiver em um estado conectado. Esse erro também poderá ser retornado se o soquete estiver no estado de fechamento de transmissão de uma solicitação anterior e o parâmetro dwFlags não tiver sido definido como TF_REUSE_SOCKET para solicitar uma reutilização do soquete. |
Comentários
A função DisconnectEx não dá suporte a soquetes de datagrama. Portanto, o soquete especificado por hSocket deve ser orientado à conexão, como um soquete SOCK_STREAM, SOCK_SEQPACKET ou SOCK_RDM.
Observação
O ponteiro de função para a função DisconnectEx deve ser obtido em tempo de execução fazendo uma chamada para a função WSAIoctl com o SIO_GET_EXTENSION_FUNCTION_POINTER opcode especificado. O buffer de entrada passado para a função WSAIoctl deve conter WSAID_DISCONNECTEX, um GUID (identificador global exclusivo) cujo valor identifica a função de extensão DisconnectEx . Em caso de êxito, a saída retornada pela função WSAIoctl contém um ponteiro para a função DisconnectEx . O GUID WSAID_DISCONNECTEX é definido no arquivo de cabeçalho Mswsock.h .
Quando lpOverlapped não é NULL, a E/S sobreposta pode não ser concluída antes do retorno de DisconnectEx , resultando no retorno da função DisconnectExFALSE e uma chamada para a função WSAGetLastError retornando ERROR_IO_PENDING. Esse design permite que o chamador continue processando enquanto a operação de desconexão é concluída. Após a conclusão da solicitação, o Windows define o evento especificado pelo membro hEvent da estrutura OVERLAPPED ou o soquete especificado por hSocket para o estado sinalizado.
Observação
Todas as E/S iniciadas por um determinado thread são canceladas quando esse thread é encerrado. Para soquetes sobrepostos, as operações assíncronas pendentes podem falhar se o thread for fechado antes da conclusão das operações. Consulte ExitThread para obter mais informações.
O estado TIME_WAIT determina o tempo que deve passar antes que o TCP possa liberar uma conexão fechada e reutilizar seus recursos. Esse intervalo entre o fechamento e a versão é conhecido como o estado TIME_WAIT ou o estado 2MSL. Durante esse tempo, a conexão pode ser reaberta a um custo muito menor para o cliente e o servidor do que estabelecer uma nova conexão. O comportamento de TIME_WAIT é especificado no RFC 793 , o que exige que o TCP mantenha uma conexão fechada para um intervalo pelo menos igual a duas vezes o tempo de vida máximo do segmento (MSL) da rede. Quando uma conexão é lançada, seu par de soquetes e recursos internos usados para o soquete podem ser usados para dar suporte a outra conexão.
O TCP do Windows é revertido para um estado de TIME_WAIT após o fechamento de uma conexão. Enquanto estiver no estado TIME_WAIT, um par de soquetes não pode ser usado novamente. O período TIME_WAIT é configurável modificando a seguinte configuração do Registro DWORD que representa o período de TIME_WAIT em segundos.
HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Serviços\TCPIP\Parâmetros\Tcptimedwaitdelay
Por padrão, a MSL é definida como 120 segundos. A configuração do registro TcpTimedWaitDelay usa como padrão um valor de 240 segundos, o que representa 2 vezes o tempo de vida máximo do segmento de 120 segundos ou 4 minutos. No entanto, você pode usar essa entrada para personalizar o intervalo. Reduzir o valor dessa entrada permite que o TCP libere conexões fechadas mais rapidamente, fornecendo mais recursos para novas conexões. No entanto, se o valor for muito baixo, o TCP poderá liberar recursos de conexão antes que a conexão seja concluída, exigindo que o servidor use recursos adicionais para restabelecer a conexão. Essa configuração do Registro pode ser definida de 0 a 300 segundos.
Windows Phone 8: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.
Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | mswsock.h |