先附上原文鏈接 最近公司項(xiàng)目用到了個(gè)人熱點(diǎn),網(wǎng)上找了一篇文章感覺不錯(cuò)分享給大家~~
強(qiáng)調(diào)一下,個(gè)人熱點(diǎn)只有在有設(shè)備連接的時(shí)候才會(huì)生成bridge100的IP地址段,所以用戶只是把個(gè)人熱點(diǎn)的按鈕打開沒有設(shè)備連接的話是無法判斷個(gè)人熱點(diǎn)是否打開,而且我試了很多設(shè)備只有bridge100的熱點(diǎn),沒有發(fā)現(xiàn)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所有(實(shí)體/虛擬)網(wǎng)卡,可以找到對(duì)應(yīng)的IP地址,A 設(shè)備開啟個(gè)人熱點(diǎn) B 設(shè)備連接A 設(shè)備的熱點(diǎn),這樣可以通過UDP實(shí)現(xiàn)兩個(gè)設(shè)備之間的通訊。
先介紹相關(guān)函數(shù)的參數(shù)
getifaddrs() 需要傳一個(gè)ifaddrs類型的結(jié)構(gòu)體地址獲取本地網(wǎng)絡(luò)接口信息,將之存儲(chǔ)于鏈表中,鏈表頭結(jié)點(diǎn)指針存儲(chǔ)于__ifap中帶回,函數(shù)執(zhí)行成功返回0,失敗返回-1。
ifa_next指向鏈表的下一個(gè)成員
ifa_name是接口名稱,以0結(jié)尾的字符串,比如eth0,lo0;
ifa_name | IP段 | IP地址 |
---|---|---|
lo0 | 本地IP | 127.0.0.1 |
en0 | 局域網(wǎng)IP | 192.168.1.23 |
pdp_ip0 | WWAN地址 | -- |
bridge100 | 橋接、熱點(diǎn)IP | 172.20.10.1 |
ifa_flags是接口的標(biāo)識(shí)位(比如當(dāng)IFF_BROADCAST或IFF_POINTOPOINT設(shè)置到此標(biāo)識(shí)位時(shí),影響聯(lián)合體變量ifu_broadaddr存儲(chǔ)廣播地址或ifu_dstaddr記錄點(diǎn)對(duì)點(diǎn)地址);
ifa_addr存儲(chǔ)該接口的IP地址;
ifa_netmask存儲(chǔ)該接口的子網(wǎng)掩碼;
ifa_dstaddr點(diǎn)對(duì)點(diǎn)地址;
ifa_data存儲(chǔ)了該接口協(xié)議族的特殊信息,它通常是NULL(一般不關(guān)注它);
AF_INET是家庭地址處于UDP或TCP的狀態(tài)AF_INET6適配ipv6;