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

A função LPWSPCancelBlockingCall cancela uma chamada de bloqueio que está em andamento no momento.

Sintaxe

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

Parâmetros

[out] lpErrno

Ponteiro para o código de erro.

Retornar valor

O valor retornado por LPWSPCancelBlockingCall será zero se a operação tiver sido cancelada com êxito. Caso contrário, o valor SOCKET_ERROR será retornado e um código de erro específico estará disponível em lpErrno.

Código do Erro Significado
WSAENETDOWN
O subsistema de rede falhou.
WSAEINVAL
Indica que não há nenhuma chamada de bloqueio pendente.

Comentários

Essa função cancela qualquer operação de bloqueio pendente para esse thread. Normalmente, ele é usado em duas situações:

  • Um cliente SPI do Windows Sockets está processando uma mensagem que foi recebida enquanto um provedor de serviços está implementando pseudobloco. Nesse caso, WSAIsBlocking será verdadeiro.
  • Uma chamada de bloqueio está em andamento e o provedor de serviços Winsock chamou de volta para a função de gancho de bloqueio do cliente Winsock SPI (por meio da função de retorno de chamada recuperada de WPUQueryBlockingCallback), que por sua vez está invocando essa função. Essa situação pode surgir, por exemplo, na implementação de uma opção Cancelar para uma operação que requer um tempo estendido para ser concluída.

Em cada caso, a chamada de bloqueio original será encerrada assim que possível com o erro WSAEINTR. (Na primeira instância, a terminação não ocorrerá até que o agendamento de mensagens do Windows tenha causado o controle a reverter de volta à rotina de pseudo-bloqueio no Winsock. Na segunda instância, a chamada de bloqueio será encerrada assim que a função de gancho de bloqueio for concluída.)

No caso de uma operação LPWSPConnect de bloqueio, o Winsock encerrará a chamada de bloqueio o mais rápido possível, mas não é possível que os recursos de soquete sejam liberados até que a conexão seja concluída (e depois seja redefinida) ou tenha o tempo limite limite. Isso provavelmente só será perceptível se o cliente WINSock SPI tentar imediatamente abrir um novo soquete (se nenhum soquete estiver disponível) ou se conectar ao mesmo par por meio de uma chamada LPWSPConnect .

Cancelar uma chamada LPWSPAccept ou LPWSPSelect não afeta negativamente os soquetes passados para essas chamadas. Somente a chamada específica falha; qualquer operação legal antes do cancelamento é legal após o cancelamento e o estado do soquete não é afetado de forma alguma.

Cancelar qualquer operação diferente de LPWSPAccept e LPWSPSelect pode deixar o soquete em um estado indeterminado. Se um cliente Winsock SPI cancelar uma operação de bloqueio em um soquete, a única operação que o cliente Winsock SPI poderá executar no soquete será uma chamada para LPWSPCloseSocket, embora outras operações possam funcionar em alguns provedores de serviço Winsock. Se um cliente Winsock SPI exigir portabilidade máxima, ele deverá ter cuidado para não depender da execução de operações após uma operação de cancelamento. Um cliente WINSock SPI pode redefinir a conexão definindo o tempo limite em SO_LINGER como zero e chamando LPWSPCloseSocket.

Se uma operação de cancelamento comprometeu a integridade do fluxo de dados de um SOCK_STREAM de alguma forma, o provedor Winsock redefinirá a conexão e falhará em todas as operações futuras diferentes de LPWSPCloseSocket com WSAECONNABORTED.

É aceitável que LPWSPCancelBlockingCall retorne com êxito se a operação de rede de bloqueio for concluída antes de ser cancelada. Nesse caso, a operação de bloqueio retornará com êxito como se LPWSPCancelBlockingCall nunca tivesse sido chamado. A única maneira de o cliente winsock SPI confirmar que uma operação foi realmente cancelada é marcar para um código de retorno de WSAEINTR da chamada de bloqueio.

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

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket