如何检查计算机是否存在?

时间:2009-10-28 00:08:23

标签: c++ windows

我写了一个小程序,它的工作方式类似于ping命令(我使用ICMPSendEcho2),但它返回一个返回值,而不仅仅是一条文本消息。现在我只有一个问题。如何以编程方式检查主机名是否存在?我的意思是,如果我想ping计算机A,我甚至没有计算机A,那么它应该说最初的ping说:“Ping请求找不到主机......”。这意味着没有具有该名称的计算机。但是如果我使用ping ping ping computerB(当它关闭时),那么它就说找不到Host。所以我的问题是如何判断一台计算机不存在,或者它只是关闭了?

提前致谢!

kampi

5 个答案:

答案 0 :(得分:3)

  

如何检查计算机是否存在?

此问题无法解决。您根本无法准确区分当前不存在的计算机和存在但尚未“ping”的计算机。

DNS无效,因为它只会告诉您IP地址和DNS名称之间是否存在绑定。它不会告诉您当前是否有与该IP地址关联的计算机。

低级ARP和路由协议也没有帮助。它们允许您(或更可能是您的操作系统)将网络数据包发送到(名义上)正确的位置,但是他们不会/不能告诉您当前是否有任何正在收听的内容。计算机的以太网电缆可能已被拔掉,计算机可能刚刚断电(但当然仍然存在),或者它可能刚被陨石击中。

我甚至没有提到有些防火墙通常会主动阻止你知道某些机器存在。

并且存在机器处于活动状态并使用IP地址的情况,但IP地址未在DNS中注册。


  

如何以编程方式检查主机名是否存在?

这是一个不同的问题。出于多种原因,主机名和计算机不是一回事。

现在,执行DNS查询将(通常)为您提供主机名存在或不存在的答案,但您仍然需要小心解释该答案。

  • 如果DNS 主机名“foo.bar.xyzzy.com”存在,则并不意味着当前存在关联的计算机(或任何其他响应实体)用这个名字,或者曾经或将来过。它可能只是回应与现实不符的信息。

  • 如果DNS 主机名“foo.bar.xyzzy.com”不存在,则可能意味着:

    • 外部网络故障或DNS服务器配置错误导致DNS产生错误结果,
    • 您机器的“解析器”配置告诉它与不知道(比方说)“。com”TLD的DNS服务进行通信。
    • 你的机器正在与一个颠覆的DNS交谈;例如想想DNS切换器!!
    • 权威DNS服务器隐藏了机器名称的存在;例如出于安全原因
    • 有人通过在源头暂时删除其DNS条目,关闭了该机器的基于外部名称的访问权限;例如他们做了一些维护。

    换句话说,尽管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尝试解析主机名。