简体   繁体   中英

Get information about devices in LAN network in iOS

I need to get list of devices(printers, laptops, ...) and information(ip, MAC, name) for each device at iPhone. I have no idea how. Could anybody help me.

Since you already have the IP-addresses you can query the ARP-table like this

    #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
        {

            static int nflag;

            int flags, 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;
            }




        }

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *s = @"0.0.0.0";
    const char *c = [s UTF8String];

    NSLog(@"MAC IS %@", [self ip2mac:c]);
}

And you need to add these classes to your project classes

  • "if_types.h"
  • "route.h"
  • "if_ether.h"

This function takes an IP-address string (xxxx) as arg and returns the mac address as a string.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM