私が興味を持っている基本的なコード シーケンスは (疑似コード) です。
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 でフィルタリングしたりする他の方法はありますか (おそらく、タイムアウトのように処理する Windows で WSAECONNRESET エラーを無視すると、このエラーは他のケースで発生する可能性があります)。
- Linux と Unix (Solaris、OpenBSD) で同様の問題はありますか?