最近負責的project真是讓我獲益良多,特別是網路的部分。防火牆的穿透,HTTP request and response,get IP Address樣樣都來,昨天剛好需要抓去自己的IP address,估狗惹一下,結果方法超級傳統,對於TCP/IP在linux上開發實在是超不熟!太慚愧惹!!
先把code轉過來貼上:(Reference:Programmatically retrieving IP Address of iPhone)
#include#include - (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) { // Check if interface is en0 which is the wifi connection on the iPhone if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { // Get NSString from C String 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; }
上面的code完全是以前在計網學到的socket programming,以前從沒搞懂過QQ,只知道隨便include一些檔案,然後按照格式打一打扣,剩下的就是send recv之類的function和字串處理,完全不去理會。利用project這個機會,查了一下linux的man document,有種豁然開朗的感覺XD
上面的code主要想法如下
用getifaddrs得到目前網路界面,然後存成link list while(link list->next != NULL){ 查看目前網路界面的名稱是不是我要的(在iphone上為en0) 如果是{ 用inet_ntoa把IP Address從電腦個格式(010...)轉成平常看到的格式(192.168.1.X) } return ip address }
此段code關鍵在inet_ntoa, getifaddrs這兩個關鍵的function,要瞭解這兩個function功能,來看看include的man document的說明
Reference[1]:QNX Reference[2]:Linux manual page Reference[3]:The Open Group
看完document後瞭解到上面include的個自功能:
ifaddrs.h: Structure that describes an Internet host arpa/inet.h: definitions for internet operations
認真看完document,總算對TCP/IP有點認識惹,一直亂include實在有點丟臉QQ
沒有留言:
張貼留言