0

上一个问题中,我尝试获取子网中的所有有效 IP 地址,因此我使用 for 循环,但在尝试之后,我发现我的代码需要 2 分钟以上才能找到子网中的所有 IP 地址,并且在某些情况下需要超过 5 分钟!

我的代码是在 Mac OS 下用 C++ 编写的;

但是在windows中,做同样的事情你只需要写net view/all命令,它就会立即打印出子网中的所有IP地址!

在 MAC 操作系统中,您可以使用它Bonjour service来完成此类工作。

这些技术如何以这种速度(Net view /allBonjour service )工作?有没有办法像这样快速完成这项工作?如果没有,请告诉我是否有 APi 可以将 Bonjour 服务直接用于我在 mac os 中的代码(C++)中?

编辑:

我发现了新想法

我在苹果上发现了一些名为 Bonjour API 的 api,这对我有帮助,但是我如何使用它我 c++,因为我知道 mac 使用 opbjectiv-c。

你好

4

2 回答 2

2

net view /all正在 Windows 网络级别上工作,而不是 IP 级别。它只会列出启用了 Windows 网络和名称解析的机器。如果您的计算机没有运行 Windows(或 samba),它们将不会被列出。打印机、路由器等也是如此。

使用 IPv4 的最佳方法是通过检查计算机的 IP 地址和网络掩码来提取当前子网中的 IP 地址列表。然后强制对每个 IP 地址进行 ARP 查找。如果设备存在于网络上,ARP 查找将始终有效,即使它已完全锁定(没有打开端口,不响应 ping)。

使用 IPv6,您基本上不走运。单个子网中可用 IP 地址的数量(18 446 744 073 709 551 616)非常浪费,无法进行详尽的搜索。

于 2012-09-01T08:59:45.023 回答
1

您应该异步工作。您需要一个发出通信请求但立即返回的函数,如IcmpSendEcho2。您必须为每个调用创建一个完成事件数组。每个事件句柄都传递给一个 IcmpSendEcho2 调用。

之后,您调用 WaitForMultipleObjects 等待所有事件集。

于 2012-09-01T08:55:08.753 回答