WinSock recvfrom() agora retorna WSAECONNRESET em vez de bloqueio ou tempo limite

Traduções deste artigo Traduções deste artigo
ID do artigo: 263823 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

No Windows 2000, um programa de UDP (User Datagram Protocol) pode não funcionar e pode gerar uma resposta WSAECONNRESET.

Causa

Se enviar um datagrama usando os resultados de função sendto em uma resposta de "Porta ICMP inacessível" e a função Selecione estiver definido para readfds, o programa retorna 1 e a chamada subseqüente para a função recvfrom não funciona com uma resposta de erro (10054) WSAECONNRESET. No Microsoft Windows NT 4.0, essa situação faz com que a função selecione bloco ou tempo limite.

Resolução

Para resolver esse problema, obtenha o service pack mais recente para o Windows 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
260910Como obter o service pack mais recente do Windows 2000
Um novo soquetes IOCTL chamado "SIO_UDP_CONNRESET" foi introduzida no Windows 2000. Quando este IOCTL é usado, o programa deve ser reescrito especificamente para o Windows 2000 obter a original do Windows NT 4.0 comportamento. Windows NT 4.0, Microsoft Windows 95 e Microsoft Windows 98 possuem não há suporte para esse novo IOCTL. Para além regravar seu aplicativo, será necessário o hotfix mencionado mais abaixo neste artigo.

O trecho de código a seguir demonstra uma técnica que pode ser usada para chamar WSAIoctl com o código de controle SIO_UDP_CONNRESET para obter o comportamento original do Windows NT 4.0.
DWORDdwBytesReturned = 0;
BOOLbNewBehavior = FALSE;
DWORDstatus;

// disable  new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(sd, SIO_UDP_CONNRESET,
&bNewBehavior, sizeof(bNewBehavior),
                   NULL, 0, &dwBytesReturned,
                   NULL, NULL);

if (SOCKET_ERROR == status)
{
DWORD dwErr = WSAGetLastError();
if (WSAEWOULDBLOCK == dwErr)
{
// nothing to do
return(FALSE);
}
else
{
printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d\n", dwErr);
return(FALSE);
}
}
				
para ser capaz de compilar esse código, é necessário ter o mswsock.h mais recentes que inclui a definição de SIO_UDP_CONNRESET ou para inserir abaixo definição dele diretamente em seu código.
// MS Transport Provider IOCTL to control
// reporting PORT_UNREACHABLE messages
// on UDP sockets via recv/WSARecv/etc.
// Path TRUE in input buffer to enable (default if supported),
// FALSE to disable.
#defineSIO_UDP_CONNRESET_WSAIOW(IOC_VENDOR,12)
				
Observação O hotfix descrito neste artigo não resolver o problema, a menos que o programa é reescrito para usar o novo IOCTL SIO_UDP_CONNRESET.

Para compilar esse código, é necessário ter o Platform SDK mais recente instalado no computador. Isso está disponível a partir do seguinte site da MSDN:
http://msdn.microsoft.com

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo. Esse problema foi corrigido primeiro no Windows 2000 Service Pack 2.

Mais Informações

Para obter mais informações sobre como instalar o Windows 2000 e hotfixes do Windows 2000 ao mesmo tempo, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
249149Instalando os hotfixes do Microsoft Windows 2000 e Windows 2000

Propriedades

ID do artigo: 263823 - Última revisão: quarta-feira, 21 de fevereiro de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
Palavras-chave: 
kbmt kbhotfixserver kbqfe kbbug kbfix kbwin2000presp2fix KB263823 KbMtpt
Traduçã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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 263823

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com