在Objective-C中编写网络发现工具

时间:2010-09-08 23:44:05

标签: objective-c network-programming

我想开始一个CS课程的项目。

任何人都可以提供有关如何编写将映射网络和状态设备信息,IP信息,开放端口等的工具的见解。

我将使用OS X.

1 个答案:

答案 0 :(得分:4)

您可以使用一些东西来发现网络上的节点。

  • SNMP将帮助检测几个不同的网络设备。广播sysName.0的SNMP获取请求将为您提供响应SNMP的任何内容的结果(即使它们没有OID的值)。有些可能是打印机,有些可能是服务器,有些可能是NAS等。sysDescr.0也可以使用,但对于许多网络设备(根据我的经验),它返回与sysName.0相同的值。 Mac OS X附带NetSNMP libraries。收到SNMP代理的响应后,您可以发送额外的SNMP请求以进一步确定有关设备的详细信息。有一些人类可读的文件可以在/usr/share/snmp/mibs中详细解释这些内容。

  • 您可以使用广播ping(您的应用程序将需要root权限才能为您提供对Internet协议的原始访问,以构建广播ping数据包或一般的ping数据包)。只播放几个数据包并等待回复。可以在Apple's website找到Mac OS X中使用的BSD ping实用程序的源代码。 ping可执行文件通常与所有者rootsetuid位一起安装,这意味着ping可执行文件作为root运行,即使在非{0}调用时也是如此-root用户(这就是非root用户可以使用ping的原因)。您会注意到,在ping的源代码中,它只以root身份创建套接字,然后立即删除其root权限。

  • Zeroconf / Bonjour也会提供帮助。看看Core Foundation's CFNetServices or Foundation's NSNetServices。 Mac系统可以配置为非常容易地发布自己。还有Windows和Linux实现,但当然,这些实际上需要在网络设备上运行,然后才能使用您的程序检测它们。

  • 为了确定打开哪些端口,您只需在所需的端口范围上运行循环并尝试建立连接。请记住,虽然许多服务器认为这是一种攻击并且会丢弃数据包,甚至可能永久地将您的IP列入黑名单。成功建立TCP连接后,可以在/etc/services文件中查找端口号以确定服务名称。这可以使用POSIX函数getnameinfo完成。

相关问题