WinSock Recvfrom() now returns WSAECONNRESET instead of blocking or timing out
This article was previously published under Q263823
This article has been archived. It is offered "as is" and will no longer be updated.
SYMPTOMS
CAUSE
RESOLUTION
260910 How to obtain the latest Windows 2000 service pack
A new sockets IOCTL called "SIO_UDP_CONNRESET" has been introduced in Windows 2000. When this IOCTL is used, the program must be rewritten specifically for Windows 2000 to obtain the original Windows NT 4.0 behavior. Windows NT 4.0, Microsoft Windows 95, and Microsoft Windows 98 have no support for this new IOCTL. In addition to rewriting your application, you will need the hotfix referenced further down in this article.
The following code snippet demonstrates a technique that can be used to call WSAIoctl with the SIO_UDP_CONNRESET control code to obtain the original Windows NT 4.0 behavior.
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);
}
}
// 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)
In order to compile this code, it is necessary to have the latest Platform SDK installed on your computer. This is available from the following MSDN Web site:
STATUS
MORE INFORMATION
249149 Installing Microsoft Windows 2000 and Windows 2000 hotfixes
Properties
Article ID: 263823 - Last Review: 12/05/2015 20:25:12 - Revision: 4.3
- Microsoft Windows 2000 Server
- Microsoft Windows 2000 Advanced Server
- Microsoft Windows 2000 Professional Edition
- kbnosurvey kbarchive kbhotfixserver kbqfe kbbug kbfix kbwin2000presp2fix KB26382
from https://support.microsoft.com/en-us/kb/263823#%2Fen-us%2Fkb%2F263823
PS: 虽然知识库说的windows 2000导致的问题,但是同事在开发过程中发现windows 7也复现了此问题,所以在开发UDP程序时,还是调用
WSAIoctl(sd, SIO_UDP_CONNRESET,....代码吧。