Compartilhar via


Função de retorno de chamada LPWSPCLOSESOCKET (ws2spi.h)

A função LPWSPCloseSocket fecha um soquete.

Sintaxe

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

Parâmetros

[in] s

Descritor que identifica um soquete.

[out] lpErrno

Ponteiro para o código de erro.

Retornar valor

Se nenhum erro ocorrer, LPWSPCloseSocket retornará zero. Caso contrário, um valor de SOCKET_ERROR será retornado e um código de erro específico estará disponível no lpErrno.

Código do Erro Significado
WSAENETDOWN
O subsistema de rede falhou.
WSAEINPROGRESS
O bloqueio da chamada do Windows Sockets está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAENOTSOCK
O descritor não é um soquete.
WSAEWOULDBLOCK
O soquete é marcado como não desbloqueado e SO_LINGER é definido como um valor de tempo limite diferente de zero.

Comentários

Essa função fecha um soquete. Mais precisamente, ele libera os descritores de soquete, portanto, outras referências a s devem falhar com o erro WSAENOTSOCK. Se essa for a última referência a um soquete subjacente, as informações de nomenclatura associadas e os dados enfileirados serão descartados. Todas as chamadas de bloqueio ou assíncronas pendentes no soquete (emitidas por qualquer thread neste processo) são canceladas sem postar nenhuma mensagem de notificação. Todas as operações sobrepostas pendentes emitidas por qualquer thread nesse processo também são canceladas. Qualquer ação de conclusão especificada para essas operações sobrepostas é executada (por exemplo, evento, rotina de conclusão ou porta de conclusão). Nesse caso, as operações sobrepostas pendentes falham com o erro status WSA_OPERATION_ABORTED . FD_CLOSE não será postado depois que LPWSPCloseSocket for chamado.

O comportamento de LPWSPCloseSocket é resumido da seguinte maneira:

  • Se SO_DONTLINGER estiver habilitado (a configuração padrão), LPWSPCloseSocket retornará imediatamente e a conexão será normalmente fechada em segundo plano.

  • Se SO_LINGER estiver habilitado com um tempo limite zero, LPWSPCloseSocket retornará imediatamente e a conexão será redefinida/encerrada.

    ou

  • Se SO_LINGER estiver habilitado com um tempo limite diferente de zero com um soquete de bloqueio, lPWSPCloseSocket bloqueará até que todos os dados sejam enviados ou o tempo limite expire.

  • Se SO_LINGER estiver habilitado com um tempo limite diferente de zero com um soquete não desbloqueado, LPWSPCloseSocket retornará imediatamente, indicando uma falha.

A semântica de LPWSPCloseSocket é afetada pelas opções de soquete SO_LINGER e SO_DONTLINGER da seguinte maneira.

Opção Intervalo Tipo de fechamento Aguarde o fechamento?
SO_DONTLINGER Não se importe Normal No
SO_LINGER Zero Forçado No
SO_LINGER Diferentes de zero Normal Yes

 

 

Se SO_LINGER estiver definido (ou seja, o membro l_onoff da estrutura persistente não for zero) e o intervalo de tempo limite, l_linger, for zero, LPWSPCloseSocket não será bloqueado mesmo se os dados enfileirados ainda não tiverem sido enviados ou reconhecidos. Isso é chamado de fechamento rígido ou anulativo, porque o circuito virtual do soquete é redefinido imediatamente e todos os dados não retornados são perdidos. Qualquer chamada LPWSPRecv no lado remoto do circuito falhará com WSAECONNRESET.

Se SO_LINGER for definido com um intervalo de tempo limite diferente de zero em um soquete de bloqueio, a chamada LPWSPCloseSocket será bloqueada em um soquete de bloqueio até que os dados restantes sejam enviados ou até que o tempo limite expire. Isso é chamado de desconexão normal. Se o tempo limite expirar antes que todos os dados sejam enviados, o provedor de serviços deverá encerrar a conexão antes que LPWSPCloseSocket retorne.

Não é recomendável habilitar SO_LINGER com um intervalo de tempo limite diferente de zero em um soquete sem bloqueio. Nesse caso, a chamada para LPWSPCloseSocket falhará com um erro de WSAEWOULDBLOCK se a operação de fechamento não puder ser concluída imediatamente. Se LPWSPCloseSocket falhar com WSAEWOULDBLOCK, o identificador de soquete ainda será válido e uma desconexão não será iniciada.

O cliente winsock SPI deve chamar LPWSPCloseSocket novamente para fechar o soquete, embora LPWSPCloseSocket possa continuar falhando, a menos que o cliente Winsock SPI faça um dos seguintes:

  • Desabilita SO_DONTLINGER.
  • Habilita SO_LINGER com um tempo limite zero.
  • Chama LPWSPShutdown para iniciar o fechamento.

Se SO_DONTLINGER estiver definido em um soquete de fluxo (ou seja, o membro l_onoff da estrutura persistente for zero), a chamada LPWSPCloseSocket retornará imediatamente e não obterá WSAEWOULDBLOCK, se o soquete estiver bloqueando ou não. No entanto, todos os dados enfileirados para transmissão serão enviados, se possível, antes que o soquete subjacente seja fechado. Isso é chamado de desconexão normal e é o comportamento padrão.

Observe que, nesse caso, o provedor Winsock tem permissão para reter todos os recursos associados ao soquete até que a desconexão normal seja concluída ou o provedor encerre a conexão devido a uma incapacidade de concluir a operação em um período determinado pelo provedor. Isso pode afetar clientes Winsock que esperam usar todos os soquetes disponíveis. Esse é o comportamento padrão; SO_DONTLINGER é definido por padrão.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows 2000 Server [somente aplicativos da área de trabalho]
Cabeçalho ws2spi.h

Confira também

LPWSPAccept

LPWSPIoctl

Wspsetsockopt

LPWSPSocket