WinSock recvfrom() agora devolve WSAECONNRESET em vez de bloquear ou tempo limite

Traduções de Artigos Traduções de Artigos
Artigo: 263823 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

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

Causa

Se enviar um datagrama utilizando os resultados de função sendto de uma resposta de "Porta ICMP inatingível" e a função Seleccionar estiver definido para readfds, o programa devolve 1 e a chamada de função recvfrom subsequente não funciona com uma resposta de erro (10054) WSAECONNRESET. No Microsoft Windows NT 4.0, esta situação faz com que a função Seleccionar bloco ou tempo limite.

Resolução

Para resolver este problema, obtenha o service pack mais recente do Windows 2000. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
260910Como obter o Windows 2000 service pack mais recente
Um IOCTL denominado "SIO_UDP_CONNRESET" de novos sockets foi introduzido no Windows 2000. Quando este IOCTL é utilizado, o programa tem de ser rescrito 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 têm sem suporte para este novo IOCTL. Para além reescrever a aplicação, terá da correcção referida mais abaixo neste artigo.

Fragmento de código seguinte demonstra uma técnica que pode ser utilizada para chamar WSAIoctl com o código de controlo 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 conseguir compilar este código, é necessário ter o Mswsock.h mais recentes que incluem a definição de SIO_UDP_CONNRESET ou inserir abaixo definição do mesmo directamente para o 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)
				
NOTA: A correcção descrita neste artigo não resolver o problema a menos que o programa é rescrito para utilizar o IOCTL SIO_UDP_CONNRESET novo.

Para compilar este código, é necessário ter o Platform SDK mais recente instalada no computador. Isto está disponível do seguinte Web site da MSDN:
http://msdn.microsoft.com

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no início deste artigo. Este problema foi corrigido pela primeira vez no Windows 2000 Service Pack 2.

Mais Informação

Para obter mais informações sobre como instalar o Windows 2000 e as correcções do Windows 2000 ao mesmo tempo, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
249149Instalar correcções do Microsoft Windows 2000 e Windows 2000

Propriedades

Artigo: 263823 - Última revisão: 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 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: 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