Alex Rivera | Logout

How do I query the ARP table on iPhone?

Asked 2010-02-13T16:06:01.020
10

I am new on iPhone development, and I want to integrate wake-on-lan into my application without squeezing my users to enter the computers MAC address when the IP is already known. I googled for about some hours, took the source code of an ARP tool, but I don't know how to manage this on iPhone.

Edit
Report

1 Answer

8

I simplified the code and fixed a memory leak.

On my machine the header files where found in /usr/include/netinet and /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;
}
answered 2011-05-17T17:40:05.293

Your Answer