Obtener la tabla ARP en iPhone / iPad

Estoy intentando get las inputs ARP en mi iPad como aquí .

Cuando compilo el código para ejecutarlo en mi iPad (por lo que no es el simulador) obtengo posts de error de encabezado faltantes. Puede resolverlos copyndo los files de encabezado en su proyecto localmente como se menciona en esta publicación .

El problema radica en la línea

sdl = (struct sockaddr_dl *) (sin + 1);

en esta pieza de código:

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

Da el siguiente post de error:

Aritmética en el puntero al tipo incompleto 'struct sockaddr_inarp *'

Cuando comstacks el código para el simulador de iPad todo funciona bien.

¿Alguien tiene una idea de cómo resolver esto? Se hace una pregunta similar (pero no resuelta) aquí .

Después de importar <netinet / if_ether.h>, debe editarlo y cambiar la línea

 #include <net/if_arp.h> 

a

 #include "if_arp.h" 

y luego, importe <net / if_arp.h> en su proyecto también. Esto debería arreglar ese error.

De todos modos, los encabezados que necesita importar para comstackr el código que envió son:

 #include "if_ether.h" #include "route.h" #include "if_arp.h" #include "if_dl.h" 

Espero que esto ayude =)

EDITAR:

Debe "Agregar files al proyecto", no simplemente importarlo con #import o #include. Puede encontrar los files anteriores de los siguientes enlaces: Archivos en "netinet" Archivos en "net"

 #include <net/ethernet.h> 

en lugar de jugar con los encabezados originales. Más información aquí: La statement implícita de la function 'ether_ntoa' no es válida en C99