Rozhraní WinSock Recvfrom() nyní vrátí WSAECONNRESET namísto zablokování nebo vypršení časového limitu

Příznaky

Protokol UDP (User Datagram) program v systému Windows 2000 nemusí fungovat a může generovat odpověď WSAECONNRESET.

Příčina

Odeslání datagramu pomocí výsledků funkce SendTo (Odeslat) v "Protokolu ICMP port nedosažitelný" odpověď a Vyberte funkci pro readfds nastavena, vrátí program 1 a následné volání funkce recvfrom nepracuje s (10054) Chyba odpověď WSAECONNRESET. V systému Microsoft Windows NT 4.0 tato situace způsobí, že funkce Vybrat blok nebo vypršení časového limitu.

Řešení

Tento problém vyřešíte pomocí nejnovější aktualizace service pack pro systém Windows 2000. Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
260910 jak získat nejnovější aktualizaci service pack pro systém Windows 2000
V systému Windows 2000 byl zaveden soketů IOCTL nazývá "SIO_UDP_CONNRESET". Pokud tento požadavek IOCTL je použit, je nutné přepsat program speciálně pro systém Windows 2000 získat původní chování systému Windows NT 4.0. Systém Windows NT 4.0, Microsoft Windows 95 a Microsoft Windows 98 nemají žádnou podporu pro tento nový požadavek IOCTL. Kromě přepisování aplikace budete potřebovat opravu hotfix uvedenou dále dolů v tomto článku.

Následující fragment kódu ukazuje metoda, pomocí které lze použít k volání WSAIoctl s SIO_UDP_CONNRESET řídicího kódu získat původní chování systému 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);
}
}

Abyste mohli zkompilovat tento kód, musíte mít nejnovější Mswsock.h, který obsahuje definice SIO_UDP_CONNRESET nebo Vložit pod definici přímo do kódu.
// 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)

Poznámka: Opravu hotfix popsanou v tomto článku nevyřeší problém pokud program je přepsána tak aby používala nové SIO_UDP_CONNRESET IOCTL.

Pro zkompilování tohoto kódu, je nutné mít v počítači nainstalována nejnovější Platform SDK. To je k dispozici na následujícím webu MSDN:

Stav

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti uvedených na začátku tohoto článku.
Tento problém byl poprvé opraven v aktualizaci Windows 2000 Service Pack 2.

Další informace

Další informace o tom, jak nainstalovat systém Windows 2000 a Windows 2000 Hotfix současně klepněte na následující číslo článku databáze Microsoft Knowledge Base:

249149 instalace systému Microsoft Windows 2000 a Windows 2000 hotfix

Vlastnosti

ID článku: 263823 - Poslední kontrola: 10. 1. 2017 - Revize: 1

Váš názor