获取网关ip linux,iOS开发之获取网关IP地址,路由器地址

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

#define ROUNDUP(a) \

((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))

#import "NetInfo.h"

#include

#include

#include

@implementation NetInfo

+ (NSString *)getGatewayIPAddress {

NSString *address = nil;

/* net.route.0.inet.flags.gateway */

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

address = @"192.168.0.1";

}

if(l>0) {

buf = malloc(l);

if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) {

address = @"192.168.0.1";

}

for(p=buf; prtm_msglen) {

rt = (struct rt_msghdr *)p;

sa = (struct sockaddr *)(rt + 1);

for(i=0; 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) {

unsigned char octet[4] = {0,0,0,0};

int i;

for (i=0; i<4; i++){

octet[i] = ( ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr >> (i*8) ) & 0xFF;

}

if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) {

in_addr_t addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr;

r = 0;

address = [NSString stringWithFormat:@"%s", inet_ntoa(*((struct in_addr*)&addr))];

NSLog(@"\naddress%@",address);

break;

}

}

}

free(buf);

}

return address;

}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值