ios中和socket相关的结构体

来源:互联网 发布:千影浏览器mac版 编辑:程序博客网 时间:2024/05/16 19:33

IPv6协议的地址长度是128位,全部可分配地址数为2的128次方(2^128)个,不再存在地址匮乏问题。同时,IPv6地址表示方式和IPv4也不同:IPv4地址表示为点分十进制格式,32位的地址分成4个8位分组,每个8位以十进制数显式,中间用点号分隔。而IPv6采用的是十六进制格式,既128位地址是以16位为一分组,每个16位分组写成4个十六进制数,中间用冒号分十六进制格式。
IPV4的地址,如:118.207.122.214
IPV6的地址,如:31da:1d3:0:2f3b:2aa:ff:fe28:9c5a

/*
 * [XSI] Structure used by kernel to store most addresses.一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构:sockaddr_in,所以要求这两个结构在内存中大小一致
 */
struct sockaddr {
    __uint8_t    sa_len;        /* total length, 即struct sockaddr对象在内存中的总长度*/
    sa_family_t    sa_family;    /* [XSI] address family: ip地址种类,值为AF_INET时,代表IPV4的地址;值为AF_INET6时,代表IPV6的地址*/
    char        sa_data[14];    /* [XSI] addr value (actually larger), 14字节的网络数据格式的地址(包括端口号和数字IP) */
};


/*
 * Socket address for IPv4, internet style.
 */
struct sockaddr_in {
    __uint8_t    sin_len;/* total length, 即struct sockaddr_in对象在内存中的总长度*/
    sa_family_t    sin_family;/* [XSI] address family: ip地址种类,值为AF_INET时,代表IPV4的地址*/
    in_port_t    sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/
    struct    in_addr sin_addr;/*IP address(必须要采用网络数据格式)*/
    char        sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了跟sockaddr结构在内存中对齐*/
};


/*
 * Socket address for IPv6
 */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define    SIN6_LEN
#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
struct sockaddr_in6 {
    __uint8_t    sin6_len;    /* length of this struct(sa_family_t) */
    sa_family_t    sin6_family;    /* AF_INET6 (sa_family_t) */
    in_port_t    sin6_port;    /* Transport layer port # (in_port_t) */
    __uint32_t    sin6_flowinfo;    /* IP6 flow information */
    struct in6_addr    sin6_addr;    /* IP6 address */
    __uint32_t    sin6_scope_id;    /* scope zone index */
};

/*
 * IPv6 address
 */
struct in6_addr {
    union {
        __uint8_t   __u6_addr8[16];
        __uint16_t  __u6_addr16[8];
        __uint32_t  __u6_addr32[4];
    } __u6_addr;            /* 128-bit IP6 address */
};


/*
 * IPv4 Internet address (a structure for historical reasons)
 */
struct in_addr {
    in_addr_t s_addr;
};

struct addrinfo {
    int    ai_flags;    /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
    int    ai_family;    /* PF_xxx */
    int    ai_socktype;    /* SOCK_xxx */
    int    ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
    socklen_t ai_addrlen;    /* length of ai_addr */
    char    *ai_canonname;    /* canonical name for hostname */
    struct    sockaddr *ai_addr;    /* binary address */
    struct    addrinfo *ai_next;    /* next structure in linked list */
};

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,所以调用者可以把hints结构中的ai_socktype成员设置成SOCK_STREAM使得返回的仅仅是适用于数据流套接口的信息。
result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。
返回值:0——成功,非0——出错,通过getAddrInfo函数判断一个字符串地址是IPV4还是IPV6


htons函数是将short整型变量从主机字节顺序转变成网络字节顺序,就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处(大尾顺序)。
host byte order 0x0010,十进制为16
network byte order 0x1000,十进制为4096




0 0