Compartilhar via


Objetos de evento e E/S sobrepostos

O Windows Sockets 2 dá suporte à E/S sobreposta e todos os provedores de transporte dão suporte a essa funcionalidade. A E/S sobreposta segue o modelo estabelecido no Windows e pode ser executada em soquetes criados com a função de soquete ou soquetes criados com a função WSASocket com o sinalizador WSA_FLAG_OVERLAPPED definido no parâmetro dwFlags .

Observação

A criação de um soquete com o atributo sobreposto não afeta se um soquete está no modo de bloqueio ou não. Soquetes criados com o atributo sobreposto podem ser usados para executar E/S sobrepostas. Isso não altera o modo de bloqueio de um soquete. Como as operações de E/S sobrepostas não são bloqueadas, o modo de bloqueio de um soquete é irrelevante para essas operações.

 

Para receber, os aplicativos usam as funções WSARecv ou WSARecvFrom para fornecer buffers nos quais os dados devem ser recebidos. Se um ou mais buffers forem postados antes do momento em que os dados foram recebidos pela rede, esses dados poderão ser colocados nos buffers do usuário imediatamente à medida que chegarem. Assim, ele pode evitar a operação de cópia que, de outra forma, ocorreria no momento em que a função recv ou recvfrom é invocada. Se os dados já estiverem presentes quando os buffers de recebimento forem postados, eles serão copiados imediatamente para os buffers do usuário.

Se os dados chegarem quando nenhum buffer de recebimento tiver sido postado pelo aplicativo, a rede recorrerá ao estilo síncrono familiar de operação. Ou seja, os dados de entrada são armazenados em buffer internamente até que o aplicativo emita uma chamada de recebimento e, assim, fornece um buffer no qual os dados podem ser copiados. Uma exceção a isso é quando o aplicativo usa setsockopt para definir o tamanho do buffer de recebimento como zero. Nesse caso, os protocolos confiáveis só permitiriam que os dados fossem recebidos quando os buffers de aplicativo tivessem sido postados e os dados em protocolos não confiáveis fossem perdidos.

No lado do envio, os aplicativos usam WSASend ou WSASendTo para fornecer ponteiros para buffers preenchidos e, em seguida, concordam em não perturbar os buffers de forma alguma até que a rede tenha consumido o conteúdo do buffer.

Chamadas de envio e recebimento sobrepostas retornam imediatamente. Um valor retornado de zero indica que a operação de E/S foi concluída imediatamente e que a indicação de conclusão correspondente já ocorreu. Ou seja, o objeto de evento associado foi sinalizado ou uma rotina de conclusão foi enfileirada e será executada quando o thread de chamada entrar no estado de espera alertável.

Um valor retornado de SOCKET_ERROR juntamente com um código de erro de WSA_IO_PENDING indica que a operação sobreposta foi iniciada com êxito e que uma indicação subsequente será fornecida quando os buffers de envio tiverem sido consumidos ou quando uma operação de recebimento for concluída. No entanto, para soquetes que são estilo de fluxo de bytes, a indicação de conclusão ocorre sempre que os dados de entrada são esgotados, independentemente de os buffers estarem cheios. Qualquer outro código de erro indica que a operação sobreposta não foi iniciada com êxito e que nenhuma indicação de conclusão será apresentada.

As operações de envio e recebimento podem ser sobrepostas. As funções de recebimento podem ser invocadas várias vezes para postar buffers de recebimento em preparação para dados de entrada, e as funções de envio podem ser invocadas várias vezes para enfileirar vários buffers a serem enviados. Embora o aplicativo possa depender de uma série de buffers de envio sobrepostos sendo enviados na ordem fornecida, as indicações de conclusão correspondentes podem ocorrer em uma ordem diferente. Da mesma forma, no lado receptor, os buffers podem ser preenchidos na ordem em que são fornecidos, mas as indicações de conclusão podem ocorrer em uma ordem diferente.

Em muitos casos, as operações sobrepostas do Winsock usando AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile e funções semelhantes são canceláveis. No entanto, o comportamento é indefinido para o uso contínuo de um soquete que cancelou operações pendentes. A função closesocket deve ser chamada depois de cancelar uma operação sobreposta. Portanto, para obter melhores resultados, em vez de cancelar a E/S diretamente, a função closesocket deve ser chamada para fechar o soquete que eventualmente descontinuará todas as operações pendentes.

O recurso de conclusão adiada de E/S sobreposta também está disponível para o WSAIoctl, que é uma versão aprimorada do ioctlsocket.