iOS – 获取ARP表

我正在试图build立一个networking扫描仪。 我知道这个过程,所以我想pingnetworking中所有可用的主机,然后得到ARP表,这样我就可以映射每个IP的MAC地址。 我谷歌searchARP表,但我没有find任何指导如何实现这一function。 我也发现堆栈溢出这些类似的问题:

链接1

LINK2

答案不清楚如何实现ARPfunction。 有这个官方指南吗? 苹果是否批准ARP表function?

在10.2之后更新

在这里检查图书馆

我终于得到了它的工作,所以我会详细的过程,以节省一些时间为其他人:

  1. 转至应用程序,右键单击Xco​​de – >显示包内容并浏览至: 开发人员▸平台▸MacOSX.platform▸开发人员▸SDK▸MacOSX10.10.sdk▸usr▸include 。 从“net”文件夹复制route.hif_types.h然后从“netinet”文件夹复制if_ether.h到你的Xcode项目。
  2. 然后导入下面的.m.h文件:

MacFinder.h

 #import <Foundation/Foundation.h> #include <sys/param.h> #include <sys/file.h> #include <sys/socket.h> #include <sys/sysctl.h> #include <net/if.h> #include <net/if_dl.h> #include "if_types.h" #if TARGET_IPHONE_SIMULATOR #include <net/route.h> #else #include "route.h" #endif #include "if_ether.h" #include <netinet/in.h> #include <arpa/inet.h> #include <err.h> #include <errno.h> #include <netdb.h> #include <paths.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @interface MacFinder : NSObject{ int nflag; } -(NSString*) ip2mac: (char*)ip; @end 

MacFinder.m

 #import "MacFinder.h" @implementation MacFinder -(NSString*) ip2mac: (char*)ip { int found_entry = 0; NSString *mAddr = nil; u_long addr = inet_addr(ip); int mib[6]; size_t needed; char *host, *lim, *buf, *next; struct rt_msghdr *rtm; struct sockaddr_inarp *sin; struct sockaddr_dl *sdl; extern int h_errno; struct hostent *hp; mib[0] = CTL_NET; mib[1] = PF_ROUTE; mib[2] = 0; mib[3] = AF_INET; mib[4] = NET_RT_FLAGS; mib[5] = RTF_LLINFO; if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) err(1, "route-sysctl-estimate"); if ((buf = malloc(needed)) == NULL) err(1, "malloc"); if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) err(1, "actual retrieval of routing table"); lim = buf + needed; for (next = buf; next < lim; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; sin = (struct sockaddr_inarp *)(rtm + 1); sdl = (struct sockaddr_dl *)(sin + 1); if (addr) { if (addr != sin->sin_addr.s_addr) continue; found_entry = 1; } if (nflag == 0) hp = gethostbyaddr((caddr_t)&(sin->sin_addr), sizeof sin->sin_addr, AF_INET); else hp = 0; if (hp) host = hp->h_name; else { host = "?"; if (h_errno == TRY_AGAIN) nflag = 1; } if (sdl->sdl_alen) { u_char *cp = LLADDR(sdl); mAddr = [NSString stringWithFormat:@"%x:%x:%x:%x:%x:%x", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]]; // ether_print((u_char *)LLADDR(sdl)); } else mAddr = nil; } if (found_entry == 0) { return nil; } else { return mAddr; } } @end 
  1. 然后在您的ViewController导入MacFinder.h文件
  2. 示例如何使用它为您想要findMAC地址的每个主机:

MacFinder *mc = [[MacFinder alloc]init]; NSString *mac = [mc ip2mac:"192.168.10.24"]; NSLog(@"Mac:%@",mac);

如果你仍然在这里遇到麻烦的是教程和在这里完整的工作项目(包括必要的文件)