IOS和stock相关结构体演示

#import <Foundation/Foundation.h>

#include <arpa/inet.h> //for inet_addr
#import <netdb.h>   //for struct addrinfo

/*
 *使用inet_pton函数将ipv6地址转成字节序,即网络数据格式
 */
void ipv6String2in6_addr(){
    
    struct in6_addr ip;
    char *addr1, *addr2, *addr3;
    
    addr1 = strdup("2a01:198:603:0:396e:4789:8e99:890f");
    addr2 = strdup("2a01:198:603:0::");
    addr3 = strdup("2a01::");
    
    inet_pton(AF_INET6, addr1, &ip);
    int i = 0;
    for(i = 0; i < 16; i ++)
        printf("0x%x ", ip.s6_addr[i]);
    
    printf("\n---------------------\n");
    inet_pton(AF_INET6, addr2, &ip);
    for(i = 0; i < 16; i ++)
        printf("0x%x ", ip.s6_addr[i]);
    
    printf("\n---------------------\n");
    inet_pton(AF_INET6, addr3, &ip);
    for(i = 0; i < 16; i ++)
        printf("0x%x ", ip.s6_addr[i]);
    
    printf("\n---------------------\n");
}

/*
 *使用inet_addr函数将ipv4地址转成字节序,即网络数据格式
 */
void ipv4String2in_addr0(){
    NSString *ipString = @"192.168.0.1";
    struct in_addr ip;
    ip.s_addr = inet_addr([ipString UTF8String]);
    printf("%d", ip.s_addr);
    
    printf("\n---------------------\n");
}

/*
 *使用inet_pton函数将ipv4地址转成字节序,即网络数据格式
 */
void ipv4String2in_addr1(){
    NSString *ipString = @"192.168.0.1";
    struct in_addr ip;
    const char *add = [ipString UTF8String];
    
    inet_pton(AF_INET, add, &ip);
    printf("%d", ip.s_addr);
    
    printf("\n---------------------\n");
}

void getAddressInfo(NSString *hostString){
    struct addrinfo hints, *res, *res0;
    
    memset(&hints, 0, sizeof(hints));
    hints.ai_family   = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    
    int gai_error = getaddrinfo([hostString UTF8String], [@"16" UTF8String], &hints, &res0);
    if (gai_error != 0) {
        return;
    }
    
    for (res = res0; res; res = res->ai_next)
    {
        if (res->ai_family == AF_INET) {
            NSLog(@"ai_family = %d, AF_INET", AF_INET);
            struct sockaddr_in *sockaddr = (struct sockaddr_in *)res->ai_addr;
            in_port_t port = sockaddr->sin_port;
            NSLog(@"port = %d", port);
            NSLog(@"port = %d", htons(16));//主机字节顺序转变成网络字节顺序
            
            NSLog(@"host = %d", sockaddr->sin_addr.s_addr);//主机字节顺序转变成网络字节顺序
            
            NSString *ipString0 = hostString;
            struct in_addr ip0;
            ip0.s_addr = inet_addr([ipString0 UTF8String]);//主机字节顺序转变成网络字节顺序
            NSLog(@"host = %d", ip0.s_addr);
            
            NSString *ipString1 = hostString;
            struct in_addr ip1;
            const char *add1 = [ipString1 UTF8String];
            inet_pton(AF_INET, add1, &ip1);//主机字节顺序转变成网络字节顺序
            NSLog(@"host = %d", ip1.s_addr);
            
            
        }else if (res->ai_family == AF_INET6) {
            NSLog(@"ai_family = %d, AF_INET6", AF_INET6);
            struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)res->ai_addr;
            in_port_t port = sockaddr->sin6_port;
            NSLog(@"port = %d", port);
            NSLog(@"port = %d", htons(16));//主机字节顺序转变成网络字节顺序
            
            for(int i = 0; i < 16; i ++)
                printf("0x%x ", sockaddr->sin6_addr.s6_addr[i]);
            
            printf("一样吗?\n");
            struct in6_addr ip;
            const char *addr1 = [hostString UTF8String];
            inet_pton(AF_INET6, addr1, &ip);
            for(int j = 0; j < 16; j ++)
                printf("0x%x ", ip.s6_addr[j]);
            
        }
    }
}

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        
        getAddressInfo(@"192.168.0.1");
        getAddressInfo(@"2a01:198:603:0:396e:4789:8e99:890f");
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值