2012-05-01 2 views
6

here과 같은 iPad에서 ARP 항목을 가져 오려고합니다.iPhone/iPad에서 ARP 테이블을 얻는 중

내 iPad에서 실행되도록 코드를 컴파일 할 때 (시뮬레이터가 아님) 헤더 오류 메시지가 누락되었습니다. 이 post에서 언급 한 것처럼 로컬로 프로젝트에 헤더 파일을 복사하여 문제를 해결할 수 있습니다.

문제는 라인에 놓여

SDL = (구조체 sockaddr_dl *) (SIN + 1); 이 코드 조각

는 '구조체 sockaddr_inarp의 *'

컴파일 불완전 형의 포인터에

산술 :

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




} 

그것은 다음과 같은 오류 메시지를 제공합니다 iPad 시뮬레이터 용 코드는 모두 정상적으로 실행됩니다.

누구든지 해결 방법을 알고 있습니까? 비슷한 질문 (해결되지 않음)은 here에게 문의하십시오.

+0

안녕하세요 @ 리차드 : 알 수없는 식별자로 nflag를 받고 있습니다. 어떤 파일을 포함/가져 오기해야합니까? – Bonnie

+0

@ 리차드 : 저는'objective-C'를 처음 사용합니다. 핫스팟에 연결된 클라이언트의 IP 주소. 그리고 나는'ARP.c'와'ARP.h'를 발견했습니다. 하지만 ARP 테이블에서 IP 주소를 얻는 방법은 무엇입니까? – Martin

+0

실례합니다. .m 파일에 코드를 넣고 직접 컴파일 하시겠습니까? – Wun

답변

2

<netinet/if_ether.h>을 가져온 후, 당신은 그것을 수정해야하고

#include <net/if_arp.h> 

#include "if_arp.h" 

다음 가져 오기 < 순/if_arp.h > 프로젝트에 줄을 변경 게다가. 이 오류를 수정해야합니다. 어쨌든

당신이 게시 된 코드를 컴파일 가져와야 헤더는 다음과 같습니다이 = 도움이

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

희망)

편집 : 당신은 "프로젝트에 파일 추가"를 할 필요가

단순히 #import 또는 #include로 가져 오는 것이 아닙니다. 당신은 다음 링크에서 위의 파일을 찾을 수 있습니다 Files under "netinet" Files under "net"

+0

먼저 헤더 파일에서 항목을 찾을 수 없습니다. 내 시스템에는 여러 버전이있었습니다. 내 잘못이야. 올바른 것을 가져오고 수정 한 후에 작동했습니다 !!! :-) 많이 고마워! –

+1

이 파일의 위치를 ​​모르는 사람은 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/include/에 있습니다. 당연히, 5.1은 아마 미래에 변화 할 것이다, 그러나 그 파일의 위치는 아마이지 않을 것이다. –