我编写了一个小型测试程序,使用Dns.GetHostAddresses
来解析主机名。如果我输入的主机名不存在,则会抛出SocketException
,消息为No such host is known
。
我喜欢这个,因为错误消息足够小,可以放入我的UI,直截了当。
现在我将代码复制并粘贴到一个更大的项目中,但是这次当我输入我在测试项目中完全相同的主机名时,它会抛出一个SocketException
,但消息设置为{{ 1}}
每个程序中的堆栈跟踪都是相同的,但第一个错误是The requested name is valid, but no data of the requested type was found
,其中第二个错误是WSAHOST_NOT_FOUND
。
我可以输出自己的错误信息,但我想知道为什么每次都会抛出不同的错误?代码没有区别。
此外,似乎无论我运行每个程序多少次,它们都会继续输出相同的错误消息。它不是交替的或任何东西。
============================================ ===============================
好吧,我弄明白是什么导致了这个问题
我添加了Pcap.Net作为参考,并将其包含在WSANO_DATA
的项目中
无论如何,在我评论出来之后,using PcapDotNet.Core;
正在抛出正确的例外。
如果有人能告诉我为什么它的表现如此,以及如何绕过它,那就太好了。
答案 0 :(得分:2)
SocketException
中出现GetHostAddresses
的原因有很多。在WSA_NODATA
的情况下,这意味着DNS中有一个条目;但没有IP地址(即没有A记录)。如果无法访问DNS服务器但数据已缓存,则可能会出现其他错误。或者,如果DNS服务器无法访问且数据未缓存,则可能会出现其他错误。等等。不幸的是GetHostAddresses
将所有这些错误包装在一个异常类型中。如果您想针对每种类型的错误执行不同的操作,则必须在SocketException
中检查相关属性。如果您只想检测“它不起作用”,那么您不必检查。但是,很明显SocketException
消息因故障而异,因此我不建议仅使用Message
。更不用说,这将在其他语言版本的Windows上翻译 - 因此,如果您的应用程序的其余部分是英语,则可能看起来很奇怪,除了此消息。
从技术上讲,它可能会出现以下错误之一:WSANOTINITIALIZED
,WSAENETDOWN
,WSAHOST_NOT_FOUND
,WSATRY_AGAIN
,WSANO_RECOVERY
,WSANO_DATA
,{ {1}},WSAEINPROGRESS
和WSAEFAULT
。虽然有些是极不可能的。
我还认为,根据IPv6或IPv4是否正在发挥作用,您将获得不同的消息。