先附上原文链接 最近公司项目用到了个人热点,网上找了一篇文章感觉不错分享给大家~~
强调一下,个人热点只有在有设备连接的时候才会生成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;
网友评论