Winsock-recvfrom() ist ein gibt jetzt WSAECONNRESET statt blockieren oder Timeout

Problembeschreibung

In Windows 2000 kann eine Programm (UDP = User Datagram Protocol) funktioniert nicht und eine Antwort WSAECONNRESET.

Ursache

Wenn ein Datagramm mithilfe der Funktion Sendto Ergebnisse ein "ICMP-Port nicht erreichbar" und Wählen Sie Funktion senden für Readfds festgelegt ist, gibt das Programm 1 zurück und der nachfolgende Aufruf der Funktion Recvfrom funktioniert nicht mit WSAECONNRESET (10054) Fehler. In Microsoft Windows NT 4.0 wird diese Situation Wählen Sie Block oder Zeit.

Problemlösung

Um dieses Problem zu beheben, beziehen Sie das neueste Servicepack für Windows 2000. Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
260910 wie Sie das neueste Servicepack für Windows 2000 erhalten
Neue Sockets IOCTL namens "SIO_UDP_CONNRESET" wurde in Windows 2000. Diese IOCTL wird muss das Programm für Windows 2000 zu der ursprünglichen Windows NT 4.0-Verhalten umgeschrieben werden. Windows NT 4.0, Microsoft Windows 95 und Microsoft Windows 98 bieten keine Unterstützung für diesen neuen IOCTL. Neben Neuschreiben der Anwendung benötigen Sie das Update weiter unten in diesem Artikel.

Der folgende Codeausschnitt zeigt eine Methode, mit der SIO_UDP_CONNRESET-Steuercode der ursprünglichen Windows NT 4.0-Verhalten zu WSAIoctl aufrufen.
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);
}
}

Um diesen Code zu kompilieren, müssen Sie entweder die neueste Mswsock.h enthält die Definition eines SIO_UDP_CONNRESET oder Definition direkt in den Code einfügen.
// 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)

Hinweis In diesem Artikel beschriebene Hotfix wird das Problem nicht behoben, wenn die Anwendung mithilfe der neuen SIO_UDP_CONNRESET IOCTL angepasst.

Um diesen Code zu kompilieren, muss das aktuelle Plattform SDK auf Ihrem Computer installiert haben. Dies steht auf der folgenden MSDN-Website:

Status

Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind.
Dieses Problem wurde erstmals in Windows 2000 Service Pack 2 behoben.

Weitere Informationen

Weitere Informationen zu Windows 2000 und Windows 2000-Hotfixes gleichzeitig installieren klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:

Installieren von Microsoft Windows 2000 und Windows 2000-Hotfixes 249149

Eigenschaften

Artikelnummer: 263823 – Letzte Überarbeitung: 10.01.2017 – Revision: 1

Feedback