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