获取本机IP地址

//获取本机IP
- (NSString *)getIPAdress
{
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    success = getifaddrs(&interfaces);
    if (success == 0) {
        temp_addr = interfaces;
        while (temp_addr !=NULL) {
            if (temp_addr->ifa_addr->sa_family==AF_INET) {
                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
              address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    freeifaddrs(interfaces);
    return address;
}

 ifaddrs结构体定义如下:

    struct ifaddrs    
    {    
        struct ifaddrs  *ifa_next;    /* Next item in list */    
        char            *ifa_name;    /* Name of interface */    
        unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */    
        struct sockaddr *ifa_addr;    /* Address of interface */    
        struct sockaddr *ifa_netmask; /* Netmask of interface */    
        union    
        {    
            struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */    
            struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */    
        } ifa_ifu;    
        #define              ifa_broadaddr ifa_ifu.ifu_broadaddr    
        #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr    
        void            *ifa_data;    /* Address-specific data */    
    };   

ifa_next指向链表的下一个成员;ifa_name是接口名称,以0结尾的字符串,比如eth0,lo;

 

ifa_flags是接口的标识位(比如当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);

 

ifa_netmask存储该接口的子网掩码;结构体变量存储广播地址或点对点地址(见括弧介绍ifa_flags);

 

ifa_data存储了该接口协议族的特殊信息,它通常是NULL(一般不关注他)。

   

函数getifaddrs(int getifaddrs (struct ifaddrs **__ifap))获取本地网络接口信息,将之存储于链表中,链表头结点指针存储于__ifap中带回,函数执行成功返回0,失败返回-1,且为errno赋值。
   

很显然,函数getifaddrs用于获取本机接口信息,比如最典型的获取本机IP地址。


//获取外网IP
- (NSString *)getWANIIPAdress
{
    NSString *IP = @"0.0.0.0";
    NSURL *url = [NSURL URLWithString:@"http://ifconfig.me/ip"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:8.0];
    
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (error) {
        NSLog(@"Failed to get WAN IP Address!\n%@", error);
        [[[UIAlertView alloc] initWithTitle:@"获取外网 IP 地址失败" message:[error localizedFailureReason] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
    } else {
        NSString *responseStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        IP = responseStr;
    }
    
    return IP;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值