2016-02-28 100 views
1

我一直在尋找StackOverflow,但我還沒有找到一種方法來在iOS中以編程方式獲取Wifi路由器IP地址。這可能嗎?如果是這樣,我該如何去做呢?如何在Objective C中獲取路由器的IP地址?

+0

http://stackoverflow.com/questions/3074 8480/swift-get-devices-ip-address – Shades

+0

是否會給出wifi的路由器號碼或手機的唯一IP地址? – Jared

回答

2
#include <stdio.h> 
#include <netinet/in.h> 
#include <stdlib.h> 
#include <sys/sysctl.h> 
#include <net/if.h> 
#include <string.h> 
#include <arpa/inet.h> 

#if TARGET_IPHONE_SIMULATOR 
#include <net/route.h> 
#else 
#include "route.h" 
#endif 

#define CTL_NET   4    /* network, see socket.h */ 

#if defined(BSD) || defined(__APPLE__) 

#define ROUNDUP(a) \ 
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) 

static int getdefaultgateway(in_addr_t * addr) 
{ 
    int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, 
     NET_RT_FLAGS, RTF_GATEWAY}; 
    size_t l; 
    char * buf, * p; 
    struct rt_msghdr * rt; 
    struct sockaddr * sa; 
    struct sockaddr * sa_tab[RTAX_MAX]; 
    int i; 
    int r = -1; 
    if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) { 
     return -1; 
    } 
    if(l>0) { 
     buf = malloc(l); 
     if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) { 
      return -1; 
     } 
     for(p=buf; p<buf+l; p+=rt->rtm_msglen) { 
      rt = (struct rt_msghdr *)p; 
      sa = (struct sockaddr *)(rt + 1); 
      for(i=0; i<RTAX_MAX; i++) { 
       if(rt->rtm_addrs & (1 << i)) { 
        sa_tab[i] = sa; 
        sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); 
       } else { 
        sa_tab[i] = NULL; 
       } 
      } 

      if(((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) 
       && sa_tab[RTAX_DST]->sa_family == AF_INET 
       && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) { 


       if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) { 
        char ifName[128]; 
        if_indextoname(rt->rtm_index,ifName); 

        if(strcmp("en0",ifName)==0){ 

         *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr; 
         r = 0; 
        } 
       } 
      } 
     } 
     free(buf); 
    } 
    return r; 
} 

static NSString* routerIP() 
{ 
    struct in_addr gatewayaddr; 
    int r = getdefaultgateway(&(gatewayaddr.s_addr)); 
    if (r >= 0) { 
     return [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)]; 
    } 

    return nil; 
} 

#endif 

https://stackoverflow.com/a/9173849/4069848

UPDATE extected:條件編譯爲route.h

UPDATE:如果你想獲得一個特定的接口的網關,只需更改界面名此行:

if(strcmp("en0",ifName)==0){ 
+0

它說net/route.h找不到? – Jared

+0

@Jared我已經測試了一個新的空xcode項目,並在模擬器上運行良好 – Danilo

+0

有什麼我必須導入? – Jared