WinSock Recvfrom() devuelve ahora WSAECONNRESET en lugar de bloqueo o tiempo de espera

Seleccione idioma Seleccione idioma
Id. de artículo: 263823 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

En Windows 2000, un programa de protocolo de datagramas de usuario (UDP) no funcionen y puede generar una respuesta WSAECONNRESET.

Causa

Si envía un datagrama mediante los resultados de función de sendto en una respuesta de "Puerto ICMP inaccesible" y la función Seleccionar está configurado para readfds, el programa devuelve 1 y la siguiente llamada a la función recvfrom no funciona con una respuesta WSAECONNRESET (10054) error. En Microsoft Windows NT 4.0, esta situación hace que la función Seleccionar bloque o tiempo de espera.

Solución

Para resolver este problema, obtenga el Service Pack más reciente de Windows 2000. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
260910Cómo obtener el Service Pack más reciente para Windows 2000
Se ha introducido un nuevos sockets IOCTL denominado "SIO_UDP_CONNRESET" en Windows 2000. Cuando se utiliza este IOCTL, el programa debe escribirse específicamente para que Windows 2000 obtener el original de Windows NT 4.0 comportamiento. Windows NT 4.0, Microsoft Windows 95 y Microsoft Windows 98 no disponen de compatibilidad con este nuevo IOCTL. Para además volver a escribir la aplicación, necesitará la revisión mencionada más abajo en este artículo.

El fragmento de código siguiente demuestra una técnica que puede utilizarse para llamar a WSAIoctl con el código de control SIO_UDP_CONNRESET para obtener el comportamiento de Windows NT 4.0 original.
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 poder compilar este código, debe tener el mswsock.h más reciente que incluye la definición de SIO_UDP_CONNRESET o Insertar debajo de la definición de ella directamente en el 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 el hotfix que se describe en este artículo no resuelve el problema a menos que el programa se reescribe para utilizar el nuevo IOCTL SIO_UDP_CONNRESET.

Para compilar este código, es necesario tener instalado en su equipo el SDK de plataforma más reciente. Esto está disponible en el siguiente sitio Web de MSDN:
http://msdn.microsoft.com

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:" de este artículo. Este problema se corrigió por primera vez en el Service Pack 2 de Windows 2000.

Más información

Para obtener más información acerca de cómo instalar Windows 2000 y revisiones de Windows 2000 al mismo tiempo, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
249149Instalar revisiones de Microsoft Windows 2000 y Windows 2000

Propiedades

Id. de artículo: 263823 - Última revisión: miércoles, 21 de febrero de 2007 - Versión: 4.3
La información de este artículo se refiere a:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
Palabras clave: 
kbmt kbhotfixserver kbqfe kbbug kbfix kbwin2000presp2fix KB263823 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 263823

Enviar comentarios

 

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