Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-获取ARP表_Ios_Iphone_Network Programming_Mac Address - Fatal编程技术网

iOS-获取ARP表

iOS-获取ARP表,ios,iphone,network-programming,mac-address,Ios,Iphone,Network Programming,Mac Address,我正在尝试建立一个网络扫描仪。 我知道这个过程,所以我想ping网络中所有可用的主机,然后获取ARP表,这样我就可以映射每个IP的MAC地址。 我在谷歌上搜索了ARP表,但没有找到如何实现此功能的指南。 我还发现了关于堆栈溢出的类似问题: 关于如何实现ARP功能,答案还不清楚。 这个有官方指南吗?苹果是否批准ARP表功能?在10.2之后更新 查查图书馆 我终于让它工作了,所以我将详细地发布程序,为其他人节省一些时间: 转到应用程序,右键单击Xcode->Show package conten

我正在尝试建立一个网络扫描仪。 我知道这个过程,所以我想ping网络中所有可用的主机,然后获取ARP表,这样我就可以映射每个IP的MAC地址。 我在谷歌上搜索了ARP表,但没有找到如何实现此功能的指南。 我还发现了关于堆栈溢出的类似问题:

关于如何实现ARP功能,答案还不清楚。
这个有官方指南吗?苹果是否批准ARP表功能?

在10.2之后更新

查查图书馆

我终于让它工作了,所以我将详细地发布程序,为其他人节省一些时间:

  • 转到应用程序,右键单击Xcode->Show package contents并浏览到:Developer▸ 平台▸ MacOSX.platform▸ 开发商▸ SDK▸ MacOSX10.10.sdk▸ usr▸ 包括。从“net”文件夹复制
    route.h
    if_types.h
    ,并从“netinet”文件夹复制
    if_ether.h
    到您的Xcode项目中
  • 然后导入以下
    .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
    
    #导入
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括“if_types.h”
    #if TARGET_IPHONE_模拟器
    #包括
    #否则
    #包括“路线h”
    #恩迪夫
    #包括“如果使用乙醚,则为h”
    #包括
    
    #include是教程,调用
    malloc
    的完整工作项目(包括必要的文件)是一个漏洞。对
    gethostbyaddr
    的调用看起来是多余的。否则,这就像一个符咒。谢谢请随时更新答案并修复漏洞!我一步一步地遵循这些说明,但mac地址始终为零,因为find_entry int始终为0。有人有主意吗?(IP是100%有效)@user3191334如果您仍然有问题,这里是教程,这里是完整的工作项目(包括必要的文件),我们打开了一个问题,以解决问题。
    #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