How can I determine the default gateway on iPhone?

后端 未结 5 708
栀梦
栀梦 2020-12-03 09:31

I need to obtain the IP address of the default gateway in an iPhone application. I cannot find the proper API. Anyone know if iPhone exposes this information?

5条回答
  •  一向
    一向 (楼主)
    2020-12-03 09:41

    I have solved this, though i dunno if this solution is valid (wont be rejected by apple)

    first i'll give you the sources i used to build my solution upon:

    http://code.google.com/p/doubango/source/browse/trunk/thirdparties/iphone/include/net/route.h?r=348

    http://code.google.com/p/touchcode/source/browse/Experimental/TouchHTTPD/Externals/libnatpmp-20071213/getgateway.c?r=bc90b03205cbebb0633a7b5b203c2c6d5cb860dc

    It would be great to get some feedback if you think apple will allow this kind of code.

    getgateway.h

    #ifndef __GETGATEWAY_H__
    #define __GETGATEWAY_H__
    
    /* getdefaultgateway() :
     * return value :
     *    0 : success
     *   -1 : failure    */
    int getdefaultgateway(in_addr_t * addr);
    
    #endif
    

    getgateway.c

    #include 
    #include 
    #include 
    #include 
    #include "getgateway.h"
    #include "route.h"
    #include 
    #include 
    
    #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; prtm_msglen) {
                rt = (struct rt_msghdr *)p;
                sa = (struct sockaddr *)(rt + 1);
                for(i=0; irtm_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
    

提交回复
热议问题