2012-05-01 12 views
6

मैं अपने आईपैड पर here जैसे एआरपी प्रविष्टियां प्राप्त करने की कोशिश कर रहा हूं।आईफोन/आईपैड पर एआरपी टेबल प्राप्त करना

मेरे आईपैड पर चलाने के लिए कोड को संकलित करते समय (इसलिए सिम्युलेटर नहीं) मुझे अनुपलब्ध हेडर त्रुटि संदेश मिल रहा है। आप इस post में वर्णित अनुसार स्थानीय रूप से प्रोजेक्ट में हेडर फ़ाइलों की प्रतिलिपि बनाकर उन्हें हल कर सकते हैं।

समस्या लाइन में निहित है

एसडीएल = (struct sockaddr_dl *) (पाप +1);

कोड के इस टुकड़े में

:

अंकगणित अधूरा प्रकार के 'struct 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; 
    } 




} 

यह निम्न त्रुटि संदेश देता है आईपैड सिम्युलेटर के लिए कोड सब कुछ ठीक चलाता है।

क्या किसी को यह पता है कि इसे कैसे हल किया जाए? एक समान प्रश्न (लेकिन हल नहीं किया गया) here से पूछा जाता है।

+0

हाय @ रिचर्ड: - Iam को अव्यवस्थित पहचानकर्ता के रूप में nflag मिल रहा है, मुझे – Bonnie

+0

@ रिचर्ड के लिए किस फ़ाइल को शामिल/आयात करने की आवश्यकता है: मैं 'उद्देश्य-सी' के लिए नया हूं, मैं चाहता हूं क्लाइंट का 'आईपी पता' जो 'हॉटस्पॉट' से जुड़ा हुआ है। और मुझे 'ARP.c' और' ARP.h' मिला। लेकिन 'एआरपी तालिका' में 'आईपी पता' प्राप्त करने के लिए इसका उपयोग कैसे करें? – 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" 

आशा इस = मदद करता है)

संपादित करें:

आप "परियोजना के लिए फ़ाइलें जोड़ें" करने की जरूरत है , बस इसे # आयात या # शामिल के साथ आयात नहीं कर रहा है। इसके बजाय मूल हेडर के साथ खिलवाड़ की Files under "netinet" Files under "net"

+0

सबसे पहले मुझे हेडर फ़ाइल में प्रविष्टि नहीं मिल सका। मेरे सिस्टम पर कई संस्करण थे। मेरी गलती। सही आयात करने और संशोधित करने के बाद, यह काम किया !!! :-) बहुत बहुत धन्यवाद! –

+1

किसी भी व्यक्ति के लिए जो यह नहीं जानता कि इन फ़ाइलों को कहां ढूंढना है, वे/अनुप्रयोग /Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/include/ में स्थित हैं बेशक, 5.1 भविष्य में शायद बदल जाएगा, लेकिन शायद उन फ़ाइलों का स्थान नहीं। –

संबंधित मुद्दे