priore

How to get router IP address in Objective-C

Feb 27th, 2016
752
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <netinet/in.h>
  3. #include <stdlib.h>
  4. #include <sys/sysctl.h>
  5. #include <net/if.h>
  6. #include <string.h>
  7. #include <arpa/inet.h>
  8.  
  9. #if TARGET_IPHONE_SIMULATOR
  10. #include <net/route.h>
  11. #else
  12. #include "route.h"
  13. #endif
  14.  
  15. #define CTL_NET         4               /* network, see socket.h */
  16.  
  17. #if defined(BSD) || defined(__APPLE__)
  18.  
  19. #define ROUNDUP(a) \
  20. ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
  21.  
  22. static int getdefaultgateway(in_addr_t * addr)
  23. {
  24.     int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET,
  25.         NET_RT_FLAGS, RTF_GATEWAY};
  26.     size_t l;
  27.     char * buf, * p;
  28.     struct rt_msghdr * rt;
  29.     struct sockaddr * sa;
  30.     struct sockaddr * sa_tab[RTAX_MAX];
  31.     int i;
  32.     int r = -1;
  33.     if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) {
  34.         return -1;
  35.     }
  36.     if(l>0) {
  37.         buf = malloc(l);
  38.         if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) {
  39.             return -1;
  40.         }
  41.         for(p=buf; p<buf+l; p+=rt->rtm_msglen) {
  42.             rt = (struct rt_msghdr *)p;
  43.             sa = (struct sockaddr *)(rt + 1);
  44.             for(i=0; i<RTAX_MAX; i++) {
  45.                 if(rt->rtm_addrs & (1 << i)) {
  46.                     sa_tab[i] = sa;
  47.                     sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len));
  48.                 } else {
  49.                     sa_tab[i] = NULL;
  50.                 }
  51.             }
  52.  
  53.             if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY))
  54.                && sa_tab[RTAX_DST]->sa_family == AF_INET
  55.                && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) {
  56.  
  57.  
  58.                 if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) {
  59.                     char ifName[128];
  60.                     if_indextoname(rt->rtm_index,ifName);
  61.  
  62.                     if(strcmp("en0",ifName)==0){
  63.  
  64.                         *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr;
  65.                         r = 0;
  66.                     }
  67.                 }
  68.             }
  69.         }
  70.         free(buf);
  71.     }
  72.     return r;
  73. }
  74.  
  75. static NSString* routerIP()
  76. {
  77.     struct in_addr gatewayaddr;
  78.     int r = getdefaultgateway(&(gatewayaddr.s_addr));
  79.     if (r >= 0) {
  80.         return [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)];
  81.     }
  82.  
  83.     return nil;
  84. }
  85.  
  86. #endif
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×