zoukankan      html  css  js  c++  java
  • iOS用域名或主机名获取IP地址(包含C语言接口 和iOS原生)

      

      最近工作中遇到了个新需求、需要将域名 解析成ip地址,搜了搜文章博客,发现很多人都是在用C的

        struct hostent *gethostbyname(const char *);

      对于OC原生的方法还是比较陌生的,因此研究了一下,封了个方法出来,供大家参考使用,话不多说、上代码

     1 #import "TestTools.h"
     2 
     3 #include <netdb.h>
     4 #include <sys/socket.h>
     5 #include <arpa/inet.h>
     6 #include <resolv.h>
     7 
     8 @implementation TestTools
     9 
    10 + (NSString *)realmToIP:(NSString *)hostName{
    11 
    12     const char *host = [hostName UTF8String];
    13     // Get host entry info for given host
    14     struct hostent *remoteHostEnt = gethostbyname(host);
    15     
    16     // Get address info from host entry
    17     struct in_addr *remoteInAddr = (struct in_addr *) remoteHostEnt->h_addr_list[0];
    18     
    19     // Convert numeric addr to ASCII string
    20     char *sRemoteInAddr = inet_ntoa(*remoteInAddr);
    21     
    22     return [NSString stringWithFormat:@"%s",sRemoteInAddr];
    23     
    24 }
    25 
    26 + (NSString*)parsingIPAddress:(NSString*)strHostName
    27 {
    28     const char* szname = [strHostName UTF8String];
    29     struct hostent* phot ;
    30     @try
    31     {
    32         phot = gethostbyname(szname);
    33     }
    34     @catch (NSException * e)
    35     {
    36         return nil;
    37     }
    38     
    39     struct in_addr ip_addr;
    40     memcpy(&ip_addr,phot->h_addr_list[0],4);
    41     
    42     char ip[20] = {0};
    43     inet_ntop(AF_INET, &ip_addr, ip, sizeof(ip));
    44     
    45     NSString* strIPAddress = [NSString stringWithUTF8String:ip];
    46     
    47     return strIPAddress;
    48 }
    49 
    50 
    51 + (NSString*)getIPAddressByHostName:(NSString*)strHostName{
    52  
    53     Boolean result,bResolved;
    54     CFHostRef hostRef;
    55     CFArrayRef addresses = NULL;
    56     
    57     const char * hostAdd =[strHostName UTF8String];
    58     
    59     CFStringRef hostNameRef = CFStringCreateWithCString(kCFAllocatorDefault, hostAdd, kCFStringEncodingASCII);
    60     
    61     hostRef = CFHostCreateWithName(kCFAllocatorDefault, hostNameRef);
    62 
    63     result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);
    64     if (result == TRUE) {
    65         addresses = CFHostGetAddressing(hostRef, &result);
    66     }
    67 
    68     bResolved = result == TRUE ? true : false;
    69     
    70     if(bResolved)
    71     {
    72         struct sockaddr_in* remoteAddr;
    73         for(int i = 0; i < CFArrayGetCount(addresses); i++)
    74         {
    75             CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(addresses, i);
    76             remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);
    77             
    78             if(remoteAddr != NULL)
    79             {
    80                 //获取IP地址
    81                 char ip[16];
    82                 strcpy(ip, inet_ntoa(remoteAddr->sin_addr));
    83                 return [NSString stringWithUTF8String:ip];
    84             }
    85         }
    86     }
    87     CFRelease(hostNameRef);
    88     CFRelease(hostRef);
    89     return nil;
    90 }
    91 
    92 @end

    方法一,二 中 都是利用C的接口来实现,只不过在拿到 hostent * 之后处理的方式不一样,第二种方法相对要更快一点哟,另外,有些公司的域名可能是对应的服务器集群,会有很多个ip地址,像百度,网易啦这些, 我们默认都是取的数组中的第一个元素,如果你有需求要拿到其他地址, 遍历 h_addr_list 就可以啦。

    方法三,是利用OC原生的方法来实现的,

    CFStringCreateWithCString();
    CFHostCreateWithName();


    我做了一个小小的测试,三个方法 在同一个环境下,对www.baidu.com进行多次解析 求平均值,解析的地址 肯定都是没问题的啦, 但是解析所用的时间却不一样哟,方法二 用时最短,其次是 方法一,方法三最慢。。。
    不过他们相差的时间都是 非常非常小的,不到1毫秒的样子。

     

     

  • 相关阅读:
    ADO.NET FOR MySQL帮助类
    遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包
    history.back();谷歌浏览器,iframe后退问题
    Request.url请求属性
    正则表达式 取两字符中间的字符串(双向非贪婪模式)
    MVC 项目中为什么会有两个web.config
    c#动态编译并动态生成dll
    siteserver cms选择栏目搜索无效
    jquery修改Switchery复选框的状态
    ntko office在线编辑控件问题记录
  • 原文地址:https://www.cnblogs.com/like359881584/p/7249198.html
Copyright © 2011-2022 走看看