Artigo: 192599 - Última revisão: segunda-feira, 11 de Julho de 2005 - Revisão: 1.1

INFO: Evitar dados observação em Winsock

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

Observação para dados Winsock significa que uma aplicação pedidos para a quantidade de dados recebidos que aguardam ser recebida sem realmente a receber. Esta é uma holdover do Winsock 1.1 compatibilidade com o UNIX BSD sockets. Winsock, isto é conseguido com recv/WSARecv(..., MSG_PEEK) ou ioctlsocket(FIONREAD,...). Deve evitar a fazê-lo porque é muito ineficaz e indivíduos uma aplicação para uma contagem de dados incorrectos.

Mais Informação

Implementação de socket depende de tamanho fixo interno enviar e receber memórias intermédias que são atribuídas conforme for necessário da memória de conjunto não paginado, contíguo. O tamanho predefinido destas memórias intermédias é de 8 k. Receber dados de rede são colocados na memória intermédia interna de recepção para o socket.

Aplicações de Winsock que utilizam um dos métodos observação, com recv/WSARecv(..., MSG_PEEK) ou ioctlsocket(FIONREAD,...), para obter a quantidade de dados na memória intermédia de recepção é altamente ineficaz porque o sistema tem de bloquear os dados e contar. À medida que o sistema efectua este procedimento, é provável que a rede em tempo real ainda tentarão preencher a memória intermédia com mais dados. Observação também não remove os dados, que poderia permitir a memória intermédia atingir o limite de armazenamento. Como resultado, fecha-se para baixo a velocidade de fluxo de dados de rede e faz com que todo o processo de transmissão de dados ineficaz.

Consulta num socket de transmissão em sequência até chega um determinado número de bytes ou uma "mensagem" é o código incorrecto. Um socket de transmissão em sequência, tais como TCP, não preserva os limites das mensagens porque fornece uma sequência de dados. Como tal, o tamanho de mensagem maior uma aplicação pode depender nunca é um byte de comprimento. Código que utiliza a observação aguardar até chegar uma "mensagem" concluída nunca pode ter êxito protocolos baseados em sequência em Winsock onde os dados straddles vários limites de memória intermédia de sistema, devido a decisões de concepção. A operação de observação comunicará o número de bytes até o limite de memória intermédia primeiro. Bytes restantes nos limites podem nunca ser comunicados, resultando numa contagem de dados para algoritmos de código que dependem os valores de observação seja preciso incorrecta. Tentativas de observação subsequentes não revela os dados "hidden", que ainda podem ser recebidos das memórias intermédias.

A implementação de socket do protocolo baseado em sequência melhor deve descarregar dados imediatamente após a chegada no espaço de memória intermédia atribuída de aplicação. Isto permite que as memórias intermédias socket permaneça aberta para uma velocidade de fluxo de dados de rede constante à medida que a aplicação analisa os dados, resultando em muito melhor desempenho da rede.

Referências

Windows Sockets 2 especificação de API, revisão 2.2.0, 10 de Maio de 1996 apêndice C, "A lista Lame," produto 20 #, # 26.

Para obter informações adicionais, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
140263  (http://support.microsoft.com/kb/140263/EN-US/ ) PROBLEMA: o recv() w/MSG_PEEK devolve sempre errado tamanho da memória intermédia

A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition
Palavras-chave: 
kbmt kbapi kbinfo kbnetwork kbwinsock KB192599 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 192599  (http://support.microsoft.com/kb/192599/en-us/ )