美文网首页
iOS 通过HOST获取IP地址和类型

iOS 通过HOST获取IP地址和类型

作者: ___________枫林晚 | 来源:发表于2017-12-25 15:08 被阅读0次
    const char* SDKHostToIP(const char *mHost,const char *mPort)
        {
            if( nil == mHost )
                return NULL;
            const char *newChar = "No";
          //返回的结构体信息链表
            struct addrinfo* res0;
           // 配置需要返回的结构体信息组成
            struct addrinfo hints;
           // 返回的地址信息
           struct addrinfo* res;
            int n, s;
            
            // 置空结构体
            memset(&hints, 0, sizeof(hints));
            
            hints.ai_flags = AI_DEFAULT;
            hints.ai_family = PF_UNSPEC;
            hints.ai_socktype = SOCK_STREAM;
            
            if((n=getaddrinfo(mHost, "http", &hints, &res0))!=0)
            {
                printf("getaddrinfo error: %s\n",gai_strerror(n));
                return NULL;
            }
            
            struct sockaddr_in6* addr6;
            struct sockaddr_in* addr;
            NSString * NewStr = NULL;
            char ipbuf[32];
            s = -1;
            for(res = res0; res; res = res->ai_next)
            {
                if (res->ai_family == AF_INET6)
                {
                    addr6 =( struct sockaddr_in6*)res->ai_addr;
                    newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));
                    NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar
                                                                encoding:NSASCIIStringEncoding];
                    NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"];
                    
                    NewStr = [TempA stringByAppendingString: TempB];
                    printf("%s\n", newChar);
                }
                else
                {
                    addr =( struct sockaddr_in*)res->ai_addr;
                    newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));
                    NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar
                                                                encoding:NSASCIIStringEncoding];
                    NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"];
                    
                    NewStr = [TempA stringByAppendingString: TempB];
                    printf("%s\n", newChar);
                }
                break;
            }
            
            
            freeaddrinfo(res0);
            
            printf("getaddrinfo OK");
            
            NSString * mIPaddr = NewStr;
            return MakeStringCopy([mIPaddr UTF8String ]);
        }
    

    函数解析

    memset()

    memset()函数原型是extern void *memset(void *buffer, int c, int count)
    buffer:为指针或是数组,
    c:是赋给buffer的值,
    count:是buffer的长度.

    这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))
    Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
    例:char a[100];memset(a, '/0', sizeof(a));
    memset可以方便的清空一个结构类型的变量或数组。
    具体可参考:http://blog.csdn.net/qq_27522735/article/details/53374765

    getaddrinfo()

    #include<netdb.h>

    函数原型
    int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );

    参数说明
    hostname:一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串)
    service:服务名可以是十进制的端口号,也可以是已定义的服务名称,如ftp、http等
    hints:可以是一个空指针,也可以是一个指向某个addrinfo结构体的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。
    result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。
    返回值:0——成功,非0——出错
    详情可参考:http://blog.csdn.net/tianxw1209/article/details/6284582

    相关文章

      网友评论

          本文标题:iOS 通过HOST获取IP地址和类型

          本文链接:https://www.haomeiwen.com/subject/pcgowxtx.html