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

标签 c++ windows

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

提前致谢!

坎比

最佳答案

How to check if computer exists or not?

这个问题无解。您根本无法准确区分当前不存在的计算机和确实存在但无法“ping”的计算机。

DNS 没有帮助,因为它只会告诉您 IP 地址和 DNS 名称之间是否存在绑定(bind)。它不会告诉您当前是否有与该 IP 地址关联的机器。

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

而且我什至没有提到有一种叫做防火墙的东西经常主动试图阻止你知道某些机器的存在。

还有一种情况是,一台机器还活着并使用一个 IP 地址,但该 IP 地址没有在 DNS 中注册。


How can I programmatically check if a hostname exist or not?

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

现在,执行 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

关于c++ - 如何检查计算机是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634435/

相关文章:

c++ - 收到 cl_build_program_failure 错误

c - C中的后台进程

c - 当我使用内核调试器在 Windows 64 位上的 SYSCALL 的 IA32_LSTAR MSR 上设置断点时,为什么会出现 DoubleFault? (KVASCODE 部分)

c# - 从 WinService 上传 FTP 失败

c++ - Win32 应用程序使用 printf 将输出写入控制台

c++ - 如何从 g++ 链接到 VS2008 生成的 .libs

javascript - 如何检测网页中大多数不常见的超链接和隐式重定向?

c++ - 自定义 win32 拖放,无法更改无效(斜线圆圈)光标

c++ - 鼠标可调整大小、可拖动小部件

C++ 搜索 Windows 注册表