iOS获取个人热点连接状态

先附上原文链接 最近公司项目用到了个人热点,网上找了一篇文章感觉不错分享给大家~~

强调一下,个人热点只有在有设备连接的时候才会生成bridge100的IP地址段,所以用户只是把个人热点的按钮打开没有设备连接的话是无法判断个人热点是否打开,而且我试了很多设备只有bridge100的热点,没有发现bridge0的。

先看代码

+ (NSString *)getIPAddress
{
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    
    // retrieve the current interfaces - returns 0 on success
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL) {
            if( temp_addr->ifa_addr->sa_family == AF_INET || temp_addr->ifa_addr->sa_family == AF_INET6) {
                // Check if interface is en0 which is the wifi connection on the iPhone
                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"bridge100"]
                    ) {
                    // Get NSString from C String
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }else 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;
        }
    }
    
    // Free memory
    freeifaddrs(interfaces);
    
    return address;
}

遍历iOS所有(实体/虚拟)网卡,可以找到对应的IP地址,A 设备开启个人热点 B 设备连接A 设备的热点,这样可以通过UDP实现两个设备之间的通讯。
先介绍相关函数的参数

getifaddrs() 需要传一个ifaddrs类型的结构体地址获取本地网络接口信息,将之存储于链表中,链表头结点指针存储于__ifap中带回,函数执行成功返回0,失败返回-1。
ifa_next指向链表的下一个成员
ifa_name是接口名称,以0结尾的字符串,比如eth0,lo0;

ifa_name IP段 IP地址
lo0 本地IP 127.0.0.1
en0 局域网IP 192.168.1.23
pdp_ip0 WWAN地址 --
bridge100 桥接、热点IP 172.20.10.1

ifa_flags是接口的标识位(比如当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);
ifa_addr存储该接口的IP地址;
ifa_netmask存储该接口的子网掩码;
ifa_dstaddr点对点地址;
ifa_data存储了该接口协议族的特殊信息,它通常是NULL(一般不关注它);
AF_INET是家庭地址处于UDP或TCP的状态AF_INET6适配ipv6;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容