Obteniendo tabla ARP en iPhone / iPad

Estoy tratando de obtener las entradas ARP en mi iPad como aquí .

Al comstackr el código para ejecutar en mi iPad (no en el simulador), me faltan mensajes de error en el encabezado. Puede resolverlos copiando los archivos 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 este pedazo 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 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 mensaje de error:

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

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

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

Después de importar , debe editarlo y cambiar la línea

 #include  

a

 #include "if_arp.h" 

y luego importe en su proyecto también. Esto debería corregir ese error.

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

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

Espero que esto ayude =)

EDITAR:

Necesita “Agregar archivos al proyecto”, no simplemente importarlo con #import o #include. Puede encontrar los archivos anteriores de los siguientes enlaces: Archivos en “netinet” Archivos en “net”

 #include  

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

    Intereting Posts