2011-02-02 153 views
15

我需要获取我连接iPhone的wifi网络的网关地址。任何人都知道如何得到那个?如何在iPhone上获取WIFI网关地址?

只是为了澄清,我正在寻找此屏幕的信息:

enter image description here

感谢。

+0

一种技术,虽然也许有点特殊,在这里列出http://stackoverflow.com/questions/2300149/how-can-i -determine-the-default-gateway-on-iphone – 2011-02-02 08:31:29

回答

2

检查回来的苹果后,SDK不提供一个简单的方法来做到这一点。如果有的话,困难的方法是深入挖掘系统或使用traceroute。

我提交了一个错误报告,也许他们会在未来添加它。

0

看看答案Objective-C : How to fetch the router address?

也许只有切向相关,但看到这个博客帖子描述的技术:http://blog.zachwaugh.com/post/309927273/programmatically-retrieving-ip-address-of-iphone

它获得了Wi-Fi接口的IP地址,并可能被一个又一个跳板,把寻找另一种解决方案....

​​
+0

好的一点,应该检查返回的网关是否是WiFi接口上的网关 – Jakob 2013-03-06 14:26:08

+0

上面的代码返回设备的IP地址而不是网关。 – Alena 2014-07-22 09:09:43

+1

在最后的段落说的 – 2014-07-23 09:31:08

11

这对我的作品,但我需要得到route.h的拷贝在我的项目

我一般的理解是,这个代码查询,检索和路由表 并使用它的条目来确定默认又名网关IP路由

/* $Id: getgateway.c,v 1.6 2007/12/13 14:46:06 nanard Exp $ */ 
/* libnatpmp 
* Copyright (c) 2007, Thomas BERNARD <[email protected]> 
* 
* Permission to use, copy, modify, and/or distribute this software for any 
* purpose with or without fee is hereby granted, provided that the above 
* copyright notice and this permission notice appear in all copies. 
* 
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 

#include <stdio.h> 
#include <netinet/in.h> 
#include <stdlib.h> 
#include <sys/sysctl.h> 
#include "getgateway.h" 
#include "route.h" 
#include <net/if.h> 
#include <string.h> 

#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)) 

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; 
} 
#endif 
12

添加到您的项目route.h文件从http://opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/net/route.h

创建getgateway.h

int getdefaultgateway(in_addr_t * addr); 

创建getgateway.c

#include <stdio.h> 
#include <netinet/in.h> 
#include <stdlib.h> 
#include <sys/sysctl.h> 
#include "getgateway.h" 

#include "TargetConditionals.h" 
#if TARGET_IPHONE_SIMULATOR 
    #include <net/route.h> 
    #define TypeEN "en1" 
#else 
    #include "route.h" 
    #define TypeEN "en0" 
#endif 

#include <net/if.h> 
#include <string.h> 

#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)) 

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(TypeEN,ifName)==0){ 
          *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr; 
           r = 0;       
         } 
       } 
      } 
     } 
     free(buf); 
    } 
    return r; 
} 
#endif 

可以通过下面的片段中,这个例子将是在模拟器和谋善的工作。

#include "TargetConditionals.h" 
#if TARGET_IPHONE_SIMULATOR 
    #include <net/route.h> 
    #define TypeEN "en1" 
#else 
    #include "route.h" 
    #define TypeEN "en0" 
#endif 

使用此代码在您的目标C项目

#import "getgateway.h" 
#import <arpa/inet.h> 

- (NSString *)getGatewayIP { 
    NSString *ipString = nil; 
    struct in_addr gatewayaddr; 
    int r = getdefaultgateway(&(gatewayaddr.s_addr)); 
    if(r >= 0) { 
     ipString = [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)]; 
     NSLog(@"default gateway : %@", ipString); 
    } else { 
     NSLog(@"getdefaultgateway() failed"); 
    } 

    return ipString; 

}