Winsock UDP编程中,大家怎么处理ICMP错误?
情况如下:
有个echo的UDP服务器,它收到客户端发来的数据后再原封不动地发回给客户端。代码片段大致如下:
while(true)
{
nAddrLen = sizeof(SOCKADDR_STORAGE);
if((nRecvdBytes = recvfrom(ReceivingSocket, szRecvBuf, 256, 0, (sockaddr*)&SenderAddr, &nAddrLen)) == SOCKET_ERROR)
{
cout<<"ERROR: recvfrom failed with error: "<<WSAGetLastError()<<endl;
closesocket(ReceivingSocket);
WSACleanup();
break;
}
Ret = sendto(ReceivingSocket, szRecvBuf, nRecvdBytes, 0, (SOCKADDR *)&SenderAddr, nAddrLen);
if(SOCKET_ERROR == Ret)
{
cout<<"ERROR: sendto failed with error: "<<WSAGetLastError()<<endl;
closesocket(ReceivingSocket);
WSACleanup();
break;
}
}
现在的问题是:当UDP服务器接收到数据之后,在它把数据发送给客户端之前,客户端关闭了,这时发送就会导致一个ICMP端口不可达的错误。当然,那个sendto操作还是会成功的,只是下一次的recvfrom操作就会出错,返回的错误代码是WSAECONNRESET,MSDN上是这样解释的:
On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port Unreachable message.
为了不让这个recvfrom操作出错,我是这样解决的:
在创建了这个UDP的服务器端socket之后,就给它的I/O设置了个属性
BOOL bConnReset = FALSE;
DWORD dwBytesReturned = 0;
WSAIoctl(ReceivingSocket, SIO_UDP_CONNRESET, (void*)&bConnReset, sizeof(BOOL), (void*)&Ret, sizeof(int), &dwBytesReturned, 0 ,0);
想问问各位,你们是怎么处理Winsock编程中的UDP错误的?