在iPhone / iPad上获取ARP表

我试图让我的iPad像这里的ARP条目。

当编译代码运行在我的iPad上(所以不是模拟器),我正在丢失标题错误消息。 您可以通过将头文件复制到本地项目中来解决这些问题。

问题在于线

sdl =(struct sockaddr_dl *)(sin + 1);

在这段代码中:

-(NSString*) ip2mac: (char*) ip { int expire_time, flags, export_only, doing_proxy, found_entry; 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; } } 

它给出了以下错误信息:

对指向不完整types的指针的算术“struct sockaddr_inarp *”

当你编译iPad模拟器的代码时,一切运行良好。

有没有人有一个想法如何解决这个问题? 这里提出了一个类似的问题(但没有解决)。

在导入<netinet / if_ether.h>之后,您应该编辑它并更改该行

 #include <net/if_arp.h> 

 #include "if_arp.h" 

然后在你的项目中导入<net / if_arp.h>。 这应该修复这个错误。

无论如何,你需要导入的头文件来编译你发布的代码是:

 #include "if_ether.h" #include "route.h" #include "if_arp.h" #include "if_dl.h" 

希望这有助于=)

编辑:

您需要“将文件添加到项目”,而不是简单地使用#import或#include导入它。 您可以从以下链接find以上文件: “netinet” 下的文件“net”下的文件

 #include <net/ethernet.h> 

而不是搞乱原始的标题。 更多信息: 在C99中隐式声明函数'ether_ntoa'是无效的

Interesting Posts