众所周知,UDP通信是不需要提前建立连接的,只要bind后,直接recvfrom就可以了。但是写UDP转发时,发现其中一方重启后,UDP转发的接收就会失败一次。
查阅资料后发现是Winsock的Bug,在WinSock Recvfrom() 现在返回 WSAECONNRESET 代替阻止或超时(WSAIoctl中的SIO_UDP_CONNRESET参数)一文中有解释。只需要以下代码就可以解决:
int bNewBehavior = 0;
DWORD dwBytesReturned;
WSAIoctl(s, SIO_UDP_CONNRESET, &bNewBehavior, sizeof bNewBehavior, NULL, 0, &dwBytesReturned, NULL, NULL);
但是在VS2019中,找不到SIO_UDP_CONNRESET的定义,可能是Windows觉得这个Bug已经修复了?
#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)