2013-07-01 38 views
1

Apportable錯誤Apportable給出「上的指針算術到一個不完整的類型」編譯錯誤

arithmetic on a pointer to an incomplete type 'struct if_msghdr' 
socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1); 

下面是代碼。該代碼在ios/xcode上工作正常,但給上述錯誤interfaceMsgStruct與apportable。我從谷歌獲得這個代碼,它被廣泛使用,所以我不認爲代碼可能有錯誤。如果確實如此,請糾正我。

#import "MFMacAddress.h" 

@implementation MFMacAddress 

#include <sys/socket.h> 
#include <sys/sysctl.h> 
#include <net/if.h> 
#include <net/if_dl.h> 



+ (NSString *)getMacAddress 
{ 
    int     mgmtInfoBase[6]; 
    char    *msgBuffer = NULL; 
    size_t    length; 
    unsigned char  macAddress[6]; 
    struct if_msghdr *interfaceMsgStruct; 
    struct sockaddr_dl *socketStruct; 
    NSString   *errorFlag = NULL; 

    // Setup the management Information Base (mib) 
    mgmtInfoBase[0] = CTL_NET;  // Request network subsystem 
    mgmtInfoBase[1] = AF_ROUTE;  // Routing table info 
    mgmtInfoBase[2] = 0; 
    mgmtInfoBase[3] = AF_LINK;  // Request link layer information 
    mgmtInfoBase[4] = NET_RT_IFLIST; // Request all configured interfaces 

    // With all configured interfaces requested, get handle index 
    if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0) 
     errorFlag = @"if_nametoindex failure"; 
    else 
    { 
     // Get the size of the data available (store in len) 
     if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0) 
      errorFlag = @"sysctl mgmtInfoBase failure"; 
     else 
     { 
      // Alloc memory based on above call 
      if ((msgBuffer = malloc(length)) == NULL) 
       errorFlag = @"buffer allocation failure"; 
      else 
      { 
       // Get system information, store in buffer 
       if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0) 
        errorFlag = @"sysctl msgBuffer failure"; 
      } 
     } 
    } 

    // Befor going any further... 
    if (errorFlag != NULL) 
    { 
     NSLog(@"Error: %@", errorFlag); 
     return errorFlag; 
    } 

    // Map msgbuffer to interface message structure 
    interfaceMsgStruct = (struct if_msghdr *) msgBuffer; 

    // Map to link-level socket structure 
    socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1); 

    // Copy link layer address data in socket structure to an array 
    memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6); 

    // Read from char array into a string object, into traditional Mac address format 
    NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
            macAddress[0], macAddress[1], macAddress[2], 
            macAddress[3], macAddress[4], macAddress[5]]; 
    NSLog(@"Mac Address: %@", macAddressString); 

    // Release the buffer memory 
    free(msgBuffer); 

    return macAddressString; 
} 

@end 
+0

嗨tashfeen,你是如何解決這個問題的? –

+0

@PankajGaikar很長一段時間,我們的團隊因爲這些問題而留下了不少問題。如果有幫助,你可以看到接受的答案。 – tashfeen

+0

謝謝@tashfin。 –

回答

1

要獲得MAC地址,你可以做

[[UIDevice currentDevice] macAddress] 

它返回一個NSString *

你看到的編譯錯誤是IOS和Android之間的不同系統頭的結果。我們正在研究更透明的解決方案,但同時上述解決方案是一個簡單的解決方法。

+0

我們需要添加#if ANDROID並在if下包裝上面的行。 – tashfeen

0

通常你得到這個錯誤時的struct if_msghdr定義不「可見的」。

檢查是否需要#include其他頭文件,或者如果不同的條件編譯選項鎖定它。

+0

它看起來不錯,不能包含以下文件。 '#包括 的#include ' 什麼我需要做的,解決這個問題? – tashfeen

+0

做標準的事情:檢查這些文件是否在您的平臺上可用。如果是,請添加'-I'編譯器選項以指向正確的目錄。 –

相關問題