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