Partilhar via


E/S sobreposta e objetos de evento

O Windows Sockets 2 oferece suporte a E/S sobrepostas e todos os provedores de transporte oferecem suporte a esse recurso. A E/S sobreposta segue o modelo estabelecido no Windows e pode ser executada em soquetes criados com a funçãode soqueteou soquetes criados com a função deWSASocketcom o sinalizador de WSA_FLAG_OVERLAPPED definido no parâmetro dwFlags.

Observação

Criar um soquete com o atributo sobreposto não tem impacto sobre se um soquete está atualmente no modo de bloqueio ou não bloqueio. Os soquetes criados com o atributo overlapped 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 bloqueiam, o modo de bloqueio de um soquete é irrelevante para essas operações.

 

Para receber, os aplicativos usam o WSARecv ou funções 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 quando chegarem. Assim, ele pode evitar a operação de cópia que de outra forma ocorreria no momento em que o recv ou função 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, forneça 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, protocolos confiáveis só permitiriam que dados fossem recebidos quando buffers de aplicativos tivessem sido postados e dados sobre protocolos não confiáveis seriam 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.

As chamadas sobrepostas de envio e recebimento retornam imediatamente. Um valor de retorno 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 de retorno 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 tiver sido concluída. No entanto, para soquetes no estilo de fluxo de bytes, a indicação de conclusão ocorre sempre que os dados de entrada estã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 para enviar. Embora o aplicativo possa confiar em 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 recetor, 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, Winsock sobrepôs operações usando AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFilee 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çãoclosesocketdeve ser chamada após o cancelamento de 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, o que acabará descontinuando todas as operações pendentes.

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