2012-09-01 29 views
0

previous question我试图获得一个子网中的所有有效的IP地址,所以我使用for循环,但是在我尝试它之后,我发现我的代码需要更多的2分钟才能找到子网中的所有IP地址,并且在某些情况下需要5分钟以上!有没有快速的技术来获取子网中的所有IP地址?

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

但在Windows中,做同样的事情,你只写net view/all命令,它立即打印一个子网中的所有IP地址!您可以使用来做这样的工作。

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

编辑:

我找到了新的思路

我对苹果发现开发一些API叫卓悦API,我的是它的帮助,但我怎么可以使用I C++,因为我知道,Mac上使用opbjectiv -C 。

bonjour

+0

什么是'net view/all'?这会导致Windows 7出现语法错误。 – harper

+0

这是一个在Windows命令中运行的命令 – user1344201

回答

1

你应该异步工作。您需要一个发出通讯请求的功能,但立即返回,如IcmpSendEcho2。您将不得不为每个呼叫创建一个完成事件数组。每个事件句柄都被传递给一个IcmpSendEcho2调用。

之后,您调用WaitForMultipleObjects等待ALL事件设置。

+0

请检查我的编辑 – user1344201

2

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

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

对于IPv6,您基本上不走运。单个子网(18 446 744 073 709 551 616)中的可用IP地址数量太多以至于无法进行详尽的搜索。

+0

请检查我的编辑 – user1344201

+0

Bonjour是Windows网络/ Samba的Mac等价物。它只会检测Bonjour激活的设备(通常是Mac电脑)。它不会得到所有有效(使用中)的IP。 –