我感兴趣的基本代码序列是(伪代码)
sendto(some host); // host may be unreachable for now which is normal
...
if(select(readfs, timeout)) // there are some data to read
recvfrom();
自 Win2000 起,ICMP 数据包在将 UDP 数据报发送到无法访问的端口后被发送回,触发 select,之后 recvfrom 失败并显示 WSAECONNRESET。这种行为对我来说是不可取的,因为在这种情况下我希望 select 以超时结束(没有要读取的数据)。在 Windows 上,这可以通过 WSAIoctl SIO_UDP_CONNRESET ( http://support.microsoft.com/kb/263823 ) 解决。
我的问题是:
- SIO_UDP_CONNRESET 在这种情况下是最好的方法吗?
- 是否有其他方法可以忽略“选择”的 ICMP 或将其过滤为 recvfrom(也许,忽略 Windows 上的 WSAECONNRESET 错误将其视为超时,是否可以在其他情况下触发此错误)?
- Linux 和 Unix(Solaris、OpenBSD)上是否有类似的问题?