衆所周知,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)