如何查询iPhone上的ARP表?

我是iPhone开发新手,我想要将唤醒networking集成到我的应用程序中,而不必让我的用户在IP已知时input计算机的MAC地址。 我search了几个小时,拿了一个ARP工具的源代码,但我不知道如何在iPhone上pipe理这个。

由于没有人回答我的问题…这是答案;)

#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" #include "route.h" #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> -(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; } } 

从苹果arp.c在iPhone上工作

复制以下内容:

 - "if_types.h" - "route.h" - "if_ether.h" 

来自mac的头文件包含在您的项目文件夹中并添加到类中

我简化了代码并修复了内存泄漏。

在我的机器上find/ usr / include / netinet和/ usr / include / net中的头文件。

 - (NSString*)ip2mac:(in_addr_t)addr { NSString *ret = nil; size_t needed; char *buf, *next; struct rt_msghdr *rtm; struct sockaddr_inarp *sin; struct sockaddr_dl *sdl; int mib[6]; 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, sizeof(mib) / sizeof(mib[0]), NULL, &needed, NULL, 0) < 0) err(1, "route-sysctl-estimate"); if ((buf = (char*)malloc(needed)) == NULL) err(1, "malloc"); if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), buf, &needed, NULL, 0) < 0) err(1, "retrieval of routing table"); for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; sin = (struct sockaddr_inarp *)(rtm + 1); sdl = (struct sockaddr_dl *)(sin + 1); if (addr != sin->sin_addr.s_addr || sdl->sdl_alen < 6) continue; u_char *cp = (u_char*)LLADDR(sdl); ret = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]]; break; } free(buf); return ret; } 

我不知道sysctl函数是公共API的一部分。 我使用的方法明显,我的应用程序被拒绝“非公开”的API使用。 但是我也不相信除了上述方法外,还有什么办法可以做到这一点。