2012-08-02 22 views
3

我寫了一個小測試程序,使用Dns.GetHostAddresses來解析主機名。如果我輸入了一個不存在的主機名,它會拋出一個SocketException,並且該消息將是No such host is known
我喜歡這個,因爲錯誤信息足夠小,可以放入我的用戶界面,並直接指向這一點。GetHostAddresses不同的錯誤代碼

現在我簡直複製的代碼粘貼到一個稍大的項目,但是這一次,當我進入我在我的測試項目做了完全相同的主機名,它拋出一個SocketException但消息被設置爲The requested name is valid, but no data of the requested type was found

每個程序中的堆棧軌跡都是相同的,但第一個錯誤是WSAHOST_NOT_FOUND,其中第二個是WSANO_DATA

我只能輸出我自己的錯誤信息,但我想知道爲什麼每次都拋出一個不同的錯誤?代碼沒有區別。

此外,似乎無論我運行多少次程序,它們都會輸出相同的錯誤消息。它不是交替或任何東西。

============================================= ==============================

那麼我想出了什麼是造成這個問題。
我添加了Pcap.Net作爲參考,並將其包含在我的項目中using PcapDotNet.Core;
反正,在我評論出來之後,Dns.GetHostAddresses正在拋出正確的異常。

如果有人能告訴我爲什麼它的行爲如何,以及如何避免這種情況,那就太好了。

+1

既是小測試項目又是其他項目構建到同一版本的.NET? – dgvid 2012-08-02 15:50:00

+0

@dgvid是。 (15個) – Josh 2012-08-02 15:51:42

+2

這兩個項目是否在同一臺機器\網絡域上運行?第一個錯誤意味着根本找不到主機;第二個錯誤表示主機存在,但數據不完整(即沒有定義A記錄)。 – 2012-08-02 16:01:06

回答

2

GetHostAddresses發生SocketException的原因很多。在WSA_NODATA的情況下,這意味着在DNS中有條目;但沒有IP地址(即沒有A記錄)。如果您無法訪問DNS服務器但緩存了數據,則可能會得到不同的錯誤。或者,如果DNS服務器無法訪問且數據未緩存,則可能會得到不同的錯誤。不幸的是,GetHostAddresses將所有這些錯誤都包含在一個異常類型中。如果您想針對每種類型的錯誤執行不同的操作,則必須檢查SocketException中的相關屬性。如果你只是想檢測到「它不工作」,那麼你不必檢查。但是,很明顯,SocketException消息是不同的,這取決於故障,所以我不會建議只使用Message。更不用說,它會在其他語言版本的Windows上進行翻譯 - 所以,如果您的應用程序的其餘部分是英文版本,則可能會顯得很奇怪,但此消息除外。

技術上講,它可以有下列錯誤之一:WSANOTINITIALIZEDWSAENETDOWNWSAHOST_NOT_FOUNDWSATRY_AGAINWSANO_RECOVERYWSANO_DATAWSAEINPROGRESSWSAEFAULTWSAEINTR。雖然有些是不太可能的。

我也認爲你會得到不同的消息,這取決於是否使用IPv6或IPv4。