的基本代碼序列我對有趣的是(僞)上的ICMP Responsing在選擇
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數據報給端口不可達後發回,觸發選擇,後recvfrom使用WSAECONNRESET失敗。這種行爲對我來說是不可取的,因爲我希望在這種情況下選擇超時完成(沒有要讀取的數據)。在Windows上,這可以通過WSAIoctl SIO_UDP_CONNRESET(http://support.microsoft.com/kb/263823)解決。
我的問題是:
- 是SIO_UDP_CONNRESET在這種情況下,最好的方法是什麼?
- 是否有一些其他方法忽略ICMP的「選擇」或篩選recvfrom(也許,忽略Windows上的WSAECONNRESET錯誤對待它像超時,可以在其他情況下觸發此錯誤)?
- Linux和Unix(Solaris,OpenBSD)有類似的問題嗎?
您只會使用連接一次嗎?如果不是,如果您從未收到錯誤,告訴您連接不再處於活動狀態並且應該關閉,您將如何知道何時關閉連接? –
我想繼續發送數據報,直到遠程主機(實際上它是一些嵌入式系統)啓動或用戶終止此操作。 – Yury
從Linux移植應用程序時出現此錯誤。在我的情況下,它是一個非阻塞的UDP數據報廣播,我不想關閉連接,如果客戶端死了我開始在服務器上的recv上收到WSAECONNRESET錯誤!這似乎錯誤不明確。由SIO_UDP_CONNRESET修復,但在我看來,就像Winsock中的一個錯誤。 – dashesy