我写了一个小程序,它的工作方式类似于ping命令(我使用ICMPSendEcho2),但它返回一个返回值,而不仅仅是一条文本消息。现在我只有一个问题。如何以编程方式检查主机名是否存在?我的意思是,如果我想ping计算机A,我甚至没有计算机A,那么它应该说最初的ping说:“Ping请求找不到主机......”。这意味着没有具有该名称的计算机。但是如果我使用ping ping ping computerB(当它关闭时),那么它就说找不到Host。所以我的问题是如何判断一台计算机不存在,或者它只是关闭了?
提前致谢!
kampi
答案 0 :(得分:3)
如何检查计算机是否存在?
此问题无法解决。您根本无法准确区分当前不存在的计算机和存在但尚未“ping”的计算机。
DNS无效,因为它只会告诉您IP地址和DNS名称之间是否存在绑定。它不会告诉您当前是否有与该IP地址关联的计算机。
低级ARP和路由协议也没有帮助。它们允许您(或更可能是您的操作系统)将网络数据包发送到(名义上)正确的位置,但是他们不会/不能告诉您当前是否有任何正在收听的内容。计算机的以太网电缆可能已被拔掉,计算机可能刚刚断电(但当然仍然存在),或者它可能刚被陨石击中。
我甚至没有提到有些防火墙通常会主动阻止你知道某些机器存在。
并且存在机器处于活动状态并使用IP地址的情况,但IP地址未在DNS中注册。
如何以编程方式检查主机名是否存在?
这是一个不同的问题。出于多种原因,主机名和计算机不是一回事。
现在,执行DNS查询将(通常)为您提供说主机名存在或不存在的答案,但您仍然需要小心解释该答案。
如果DNS 说主机名“foo.bar.xyzzy.com”存在,则并不意味着当前存在关联的计算机(或任何其他响应实体)用这个名字,或者曾经或将来过。它可能只是回应与现实不符的信息。
如果DNS 说主机名“foo.bar.xyzzy.com”不存在,则可能意味着:
换句话说,尽管DNS响应说的是,主机名仍然可以在有意义的意义上存在。
简而言之,您无法从DNS响应中100%确定地推断出有关现实世界的任何事实。如果(例如)DNSQuery
返回9003
,则可以向非技术用户提供最简单准确的解释,如下所示:
The name 'foo.bar.xyzzy.com' cannot be resolved to a computer at this time
答案 1 :(得分:2)
比我想象的容易得多!我只需要调用DNSQuery函数,如果这将失败,错误9003(这意味着DNS名称不存在),而不是我想要的东西:)
感谢任何人的帮助!
kampi
答案 2 :(得分:1)
您可以使用DNS名称解析来确定过去是否曾注册过具有给定主机名的计算机。这意味着,但并不一定意味着机器现在存在。
任何名称解析或目录服务都是如此。
答案 3 :(得分:0)
如果根本不存在 主机名 ,则在尝试解析主机时应该会收到DNS解析程序错误。这与在ping一个恰好关闭/损坏的已知主机之后收到错误不同。
答案 4 :(得分:0)
我能想到的两种情况之间唯一的差异是,当计算机关闭但没有回复时,它必须通过某种名称解析系统(netbios,dns等)解决。
如果是这种情况,您应该可以先使用gethostbyname
尝试解析主机名。