Why does this code work on Xcode simulator but not on device?

I really hope someone will explain this to me. I am writing an application that uses its device MAC address and this code works fine on the simulator but does not work on the device.

I got this code from the question Get mac router (no syscall for ARP) in Objective-C

#include <stdio.h>

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <net/if_dl.h>
#include <ifaddrs.h>
#include <net/if_types.h>

char*  getMacAddress(char* macAddress, char* ifName) 
{
   int  success;
   struct ifaddrs *addrs;
   struct ifaddrs *cursor;
   const struct sockaddr_dl *dlAddr;
   const unsigned char* base;
   int i;

   success = getifaddrs(&addrs) == 0;
   if (success) 
   {
       cursor = addrs;
       while (cursor != 0) 
       {
           const struct sockaddr_dl *socAddr = 
           (const struct sockaddr_dl *)cursor->ifa_addr;
           _Bool afLinkFamily = (cursor->ifa_addr->sa_family == AF_LINK);
           /* Ethernet CSMA/CD */
           _Bool sdlIFTEther = (socAddr->sdl_type == IFT_ETHER);

           if ((afLinkFamily) && 
                sdlIFTEther &&
                strcmp(ifName,  cursor->ifa_name) == 0) 
           {
               dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
               base = 
                   (const unsigned char*)&dlAddr->sdl_data[dlAddr->sdl_nlen];
               strcpy(macAddress, ""); 
               for (i = 0; i < dlAddr->sdl_alen; i++) 
               {
                   if (i != 0) 
                   {
                       strcat(macAddress, ":");
                   }
                   char partialAddr[3];
                   sprintf(partialAddr, "%02X", base[i]);
                   strcat(macAddress, partialAddr);

               }
           }
           cursor = cursor->ifa_next;
       }

       freeifaddrs(addrs);
   }    
   return macAddress;
}

      

the error it gives me:

'net/if_types.h' file not found

      

so my question is why is this happening, what is the difference between running on simulator and device? Thank you in advance.

+3


source to share


1 answer


The header file is simply missing from the iOS device SDK. Apple doesn't want you to use it for any reason. If you just want the code to work, you can try to extract the required definition:

#define IFT_ETHER   0x6     /* Ethernet CSMACD */

      

and remove the line



#include <net/if_types.h>

      

completely. Although this breaks platform compatibility, where this constant can be defined for some other value.

+1


source







All Articles