2013年10月13日 星期日

iOS-GetIPAddress

最近負責的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

沒有留言:

張貼留言