3

Dns.GetHostAddresses我写了一个用于解析主机名的小测试程序。如果我输入了一个不存在的主机名,它会抛出 aSocketException并且消息是No such host is known.
我喜欢这个,因为错误消息足够小,可以放入我的 UI 中,而且直截了当。

现在我从字面上将代码复制并粘贴到一个更大的项目中,但是这次当我输入与我在测试项目中完全相同的主机名时,它会抛出一个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抛出了正确的异常。

如果有人能告诉我为什么它会这样,以及如何解决它,那就太好了。

4

1 回答 1

2

SocketExceptiona会发生的原因有很多GetHostAddresses。在 的情况下WSA_NODATA,这意味着在 DNS 中有一个条目;但没有IP地址(即没有A记录)。如果您无法访问 DNS 服务器但数据已缓存,您可能会收到不同的错误。或者,如果 DNS 服务器无法访问且数据未缓存,您可能会收到不同的错误。等等。不幸的是GetHostAddresses,将所有这些错误包装在一种异常类型中。如果您想对每种类型的错误执行不同的操作,则必须检查SocketException. 如果您只是想检测“它不起作用”,那么您不必检查。但是,很明显,SocketException消息因失败而异,所以我不建议只使用Message. 更不用说,这将在其他语言版本的 Windows 上被翻译——因此,如果您的应用程序的其余部分是英语,除了这条消息之外,它可能看起来很奇怪。

从技术上讲,它可能有以下错误之一:WSANOTINITIALIZED, WSAENETDOWN, WSAHOST_NOT_FOUND, WSATRY_AGAIN, WSANO_RECOVERY, WSANO_DATA, WSAEINPROGRESS,WSAEFAULTWSAEINTR. 虽然有些是极不可能的。

我还认为您会收到不同的消息,具体取决于使用的是 IPv6 还是 IPv4。

于 2012-08-02T20:32:53.090 回答