Resumo

Este artigo explica a diferença entre o atributo de e/s sobreposta de um soquete e o modo de bloqueio ou nonblocking do soquete.

Informações adicionais

Quando um soquete é criado, por padrão, é um soquete de bloqueio. Você pode usar o comando FIONBIO na chamada de API ioctlsocket, WSAEventSelect ou WSAAysncSelect para alterar o modo de soquete de bloqueio para nonblocking. Se uma chamada Winsock não puder ser concluída imediatamente, a chamada falhará e WSAGetLastError retornará um erro WSAEWOULDBLOCK se for um soquete nonblocking ou os blocos de chamada até que a operação seja concluída se for um soquete de bloqueio. O Soquete sobreposto atributo de e/s é diferente do modo de bloqueio ou nonblocking do soquete. Embora a implementação atual do Winsock requer atributo de e/s sobreposta para O modo de soquete nonblocking, eles são conceitualmente independentes e seu modelo de programação é diferente também. Para criar um soquete com o atributo de e/s sobreposta, você pode usar a API de soquete ou a API WSASocket com o sinalizador WSA_FLAG_OVERLAPPED definido. Se uma operação de e/s sobreposta não pode concluir imediatamente, a chamada falhará e WSAGetLastError ou GetLastError retornam WSA_IO_PENDING ou ERROR_IO_PENDING, que é realmente o mesmo definir como WSA_IO_PENDING. Para obter informações adicionais, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:

179942 info: WSA_FLAG_OVERLAPPED é necessário para soquetes não-bloqueioPor favor, note que uma vez que um soquete é criado, não há nenhuma maneira de alterar o atributo sobreposto soquete. No entanto, você pode chamar o setsockopt API com de opção em qualquer Soquete alças incluindo um valor para alterar os atributos sobrepostos para todas as chamadas de soquete sucessivas no mesmo thread. O valor de opção de padrão é 0, que define o atributo sobreposto. Todos os valores de opção diferente de zero tornam o soquete síncrono e torná-lo para que você não pode usar uma função de conclusão. Definindo o atributo de e/s sobreposto de um soquete não significa que o soquete executará uma operação de e/s sobreposta. Por exemplo, se você especificar nulo para a função de conclusão e a estrutura sobreposta em WSARecv e WSASend, ou simplesmente chamar recv ou enviar funções, eles serão concluídos em uma forma de bloqueio. Para certificar-se de que a e/s é executada em uma forma sobreposta você precisa fornecer uma estrutura sobreposta em sua função de e/s, dependendo da função que você usa.

E/s sobreposta

No Winsock 1, você cria um Soquete sobreposto usando a API de soquete e usar o arquivo Win32 e/s API ReadFile, ReadFileEx, WriteFile, WriteFileEx para executar e/s sobreposta no identificador de soquete. No Winsock 2, você cria um Soquete sobreposto usando WSASocket com o sinalizador WSA_FLAG_OVERLAPPED, ou simplesmente usando a API de soquete. Você pode usar as APIs de e/s do arquivo Win32 acima ou o Winsock 2 WSASend, WSASendTo, WSARecv e WSARecvFrom para iniciar uma operação de e/s sobreposta. Se você usar a opção SO_RCVBUF e SO_SNDBUF para definir a pilha de TCP zero receber e enviar buffer, você basicamente instrui a pilha TCP para executar e/s diretamente usando o buffer fornecido em sua chamada de e/s. Portanto, além da vantagem de nonblocking da e/s de soquete sobreposta, a outra vantagem é melhor desempenho porque você salva uma cópia de buffer entre o buffer de pilha TCP e o buffer de usuário para cada chamada de e/s. Mas você tem que certificar-se de que você não acessa o buffer de usuário depois que ele é submetido para operação sobreposta e antes da conclusão da operação sobreposta. Para determinar se a operação de e/s sobreposta está concluída, você pode usar uma das seguintes opções:

  • Você pode fornecer um identificador de evento em uma estrutura sobreposta usada na chamada de e/s e aguardar o identificador de evento para sinalizar.

  • Use GetOverlappedResult ou WSAGetOverlappedResult para pesquisar o status da operação de e/s sobreposta. No Windows NT, você pode especificar NULL como o identificador de evento na estrutura sobreposta. No entanto, no Windows 95 a estrutura sobreposta precisa conter um identificador de evento de redefinição manual. WSAGetOverlappedResult no Windows 98 e Windows Millennium Edition (ME) é modificado de forma que ele irá se comportar como o Windows NT e também pode pesquisar o status de conclusão com um identificador de evento nulo na estrutura sobreposta.

  • Use ReadFileEx, WriteFileEx, WSARecv, WSARecvFrom, WSASend, ou WSASendTo e optar por fornecer uma função de conclusão a ser chamado quando a operação de e/s sobreposta foi concluída. Se você usar a abordagem da função de conclusão, em algum momento depois de ter emitido a operação de e/s sobreposta, você precisará emitir uma função de espera do Win32 ou uma versão WSA da função Wait para aguardar em um identificador não sinalizado para colocar seu thread atual em um estado de espera alertable. Quando a operação de e/s sobreposta for concluída, sua função de conclusão é chamada, sua função de espera retornará WAIT_IO_COMPLETION e o thread de espera alertable será ativado.

  • Use GetQueuedCompletionStatus e associar um soquete, juntamente com o conjunto de atributo de e/s sobreposta, com uma porta de conclusão de e/s do Windows NT (IOCP). Com IOCP, você não precisa fornecer uma função de conclusão, aguarde um identificador de evento para sinalizar ou enquete o status da operação sobreposta. Depois de criar o IOCP e adicionar seu identificador de Soquete sobreposto para o IOCP, você pode iniciar a operação sobreposta usando qualquer uma das APIs de e/s mencionadas acima (exceto Recv, recvfrom, enviar ou SendTo). Você terá seu bloco de thread de trabalho na API GetQueuedCompletionStatus aguardando um pacote de conclusão de e/s. Quando uma e/s sobreposta é concluída, um pacote de conclusão de e/s chega ao IOCP e GetQueuedCompletionStatus retorna. IOCP é o suporte do sistema operacional Windows NT para escrever um servidor de throughput escalável e alto usando Threading muito simples e código de bloqueio em operações de e/s sobrepostas. Assim, pode haver uma vantagem significativa de desempenho do uso de e/s de soquete sobreposta com IOCPs do Windows NT.

Modo de bloqueio e nonblocking

Quando um soquete é criado, por padrão, é um soquete de bloqueio. Em operações de e/s de soquete de modo de bloqueio, conecte e aceite operações de todos os blocos até que a operação em questão seja concluída. Para alterar o modo de operação de soquete do modo de bloqueio para o modo nonblocking, você pode usar WSAAsyncSelect, WSAEventSelect ou o comando FIONBIO na chamada de API ioctlsocket. WSAAsyncSelect mapeia notificações de soquete para mensagens do Windows e é o melhor modelo para um único aplicativo de GUI com rosca. WSAEventSelect usa WSAEnumNetworkEvents para determinar a natureza da notificação de soquete no evento de sinalização e mapeia notificações de soquete, sinalizando um evento. Este é um modelo útil para aplicativos não-GUI que não têm uma bomba de mensagem, como um aplicativo de serviço do Windows NT. O comando FIONBIO na chamada de API ioctlsocket coloca o soquete no modo de nonblocking também. Mas você precisa pesquisar o status do soquete usando a API SELECT. Atualização: a configuração SO_RCVBUF como zero com recv sobreposta não é necessária para o Windows 2000, que pode copiar diretamente os dados para o buffer de recv do aplicativo. Definindo SO_SNDBUF como zero com sobreposta enviar no Windows 2000 ainda tem o mesmo benefício de salvar uma cópia de memória como no Windows NT 4,0. Também é importante que o aplicativo emite vários pendentes sobrepostas Send ' s ou RECV ' s se o aplicativo define o buffer de pilha correspondente para 0.

Precisa de mais ajuda?

Expanda suas habilidades
Explore o treinamento
Obtenha novos recursos primeiro
Ingressar no Microsoft Insider

Essas informações foram úteis?

Qual é o seu grau de satisfação com a qualidade do idioma?
O que afetou sua experiência?

Obrigado pelos seus comentários!

×