您好,我是ios开发人员,并且我正在尝试对网络套接字程序进行编程。
首先,我试图找到一种方法来获取arp表和ping等icmp Action 。
我在苹果应用商店中发现了许多出色的网络扫描仪,但我真的不知道应该从哪里开始。

我担心的只是Appstore拒绝。

  • 我可以对iOS设备使用system()函数吗?
  • 我知道我不能使用原始套接字编程,如果没有原始套接字编程,如何处理icmp和arp操作?

  • 谢谢你的关心!

    最佳答案

    https://github.com/mongizaidi/LAN-Scan

    这个例子应该很好地开始。 (请参阅https://github.com/mongizaidi/LAN-Scan/blob/master/LAN%20Scan/SimplePing.m进行ping操作)

    笔记:
    您无法获取设备的MAC地址,但可以解析另一个设备的Mac地址。
    这是解析主机Mac地址的代码(Apple不会拒绝)

    #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;
            }
    
    
    
    
        }
    

    10-04 14:01