2012-05-01 28 views
6

Tôi đang cố gắng để có được các mục ARP trên iPad của tôi như here.Bắt bảng ARP trên iPhone/iPad

Khi biên dịch mã chạy trên iPad của tôi (do đó không phải trình mô phỏng) Tôi đang nhận được thông báo lỗi tiêu đề bị thiếu. Bạn có thể giải quyết chúng bằng cách sao chép các tệp tiêu đề vào dự án của bạn tại địa phương như được đề cập trong post này.

Vấn đề nằm ở dòng

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

trong đoạn mã này:

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




} 

Nó cung cấp cho các thông báo lỗi sau:

số học trên con trỏ đến loại không đầy đủ 'struct sockaddr_inarp *'

Khi bạn biên dịch mã cho tất cả mọi thứ mô phỏng iPad chạy tốt.

Có ai có ý tưởng cách giải quyết vấn đề này không? Câu hỏi tương tự (nhưng chưa được giải quyết) được yêu cầu here.

+0

hi @Richard: - Tôi nhận được thông báo không xác định, tôi cần bao gồm/nhập cho số – Bonnie

+0

@Richard: Tôi mới dùng 'target-C', tôi muốn lấy 'địa chỉ ip' của ứng dụng khách đã kết nối với 'hotspot'. Và tôi tìm thấy 'ARP.c' và' ARP.h'. Nhưng làm thế nào để sử dụng nó để có được 'địa chỉ IP' trong' bảng ARP'? – Martin

+0

Xin lỗi, Bạn đặt mã trong tệp .m và biên dịch trực tiếp? – Wun

Trả lời

2

Sau khi nhập <netinet/if_ether.h>, bạn nên chỉnh sửa nó và thay đổi dòng

#include <net/if_arp.h> 

để

#include "if_arp.h" 

và sau đó nhập <net/if_arp.h> trong dự án của bạn cũng. Điều này sẽ khắc phục lỗi đó.

Dù sao các tiêu đề bạn cần phải nhập khẩu để biên dịch mã bạn được đăng là:

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

Hope this helps =)

EDIT:

Bạn cần phải "Add file để dự án" , không chỉ đơn giản là nhập nó với #import hoặC#include. Bạn có thể tìm thấy tập tin trên từ các liên kết sau đây: Files under "netinet" Files under "net"

+0

Đầu tiên tôi không thể tìm thấy mục nhập trong tệp tiêu đề . Trên hệ thống của tôi có nhiều phiên bản. Lỗi của tôi. Sau khi nhập và sửa đổi đúng, nó hoạt động !!! :-) Cảm ơn rất nhiều! –

+1

Đối với những người không biết tìm các tệp này ở đâu, chúng nằm trong /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/include/ Tất nhiên, phiên bản 5.1 có thể sẽ thay đổi trong tương lai, nhưng vị trí của những tệp đó có lẽ không. –

Các vấn đề liên quan