首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

IPv4与IPv6通用的结构体,麻烦注明成员说明

2013-08-09 
求一个IPv4与IPv6通用的结构体,麻烦大虾注明成员说明求一个IPv4与IPv6通用的结构体,麻烦大虾注明成员说明,

求一个IPv4与IPv6通用的结构体,麻烦大虾注明成员说明
求一个IPv4与IPv6通用的结构体,麻烦大虾注明成员说明,谢谢。
[解决办法]


IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位端口号和32位IP地址,如下所示:
    struct sockaddr_in {  
            uint8_t        sin_len; /*length of structure (16)*/  
            sa_family_t    sin_family; /* address family: AF_INET */  
            in_port_t      sin_port;   /* port in network byte order */  
            struct in_addr sin_addr;   /* internet address */  
            char           sin_zero[8]; /* pad bytes,  set to zero is ok */  
    };  
    struct in_addr{  
            in_addr_t s_addr; /*32-bit IPV4 address*/  
    };  
sa_family_t是一个无符号短整型(unsigned short)。
in_addr_t数据类型必须是一个至少32位的无符号整数类型,
in_port_t必须是一个至少16位的无符号的整数类型。

IPv6地址用sockaddr_in6结构体表示,包括16位端口号、128位IP地址和一些控制字段。UNIX Domain Socket的地址格式定义在sys/un.h中,用sockaddr_un结构体表示。各种socket地址结构体的开头都是相同的,前16位表示整个结构体的长度(并不是所有UNIX的实现都有长度字段,如Linux就没有),后16位表示地址类型。IPv4、IPv6和UNIX Domain Socket的地址类型分别定义为常数AF_INET、AF_INET6、AF_UNIX。这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。因此,socket API可以接受各种类型的sockaddr结构体指针做参数,例如bind、accept、connect等函数,这些函数的参数应该设计成void *类型以便接受各种类型的指针,但是sock API的实现早于ANSI C标准化,那时还没有void *类型,因此这些函数的参数都用struct sockaddr *类型表示,即通用地址结构,如下所示:
    struct sockaddr {  
            uint8_t      sa_len;  
            sa_family_t  sin_family;  


            char         sa_data[14];  
    };  
 


[解决办法]
分行+蹭分IPv4与IPv6通用的结构体,麻烦注明成员说明
IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,
包括16位端口号和32位IP地址,如下所示:
    struct sockaddr_in {
            uint8_t        sin_len; /*length of structure (16)*/
            sa_family_t    sin_family; /* address family: AF_INET */
            in_port_t      sin_port;   /* port in network byte order */
            struct in_addr sin_addr;   /* internet address */
            char           sin_zero[8]; /* pad bytes,  set to zero is ok */
    };
    struct in_addr{
            in_addr_t s_addr; /*32-bit IPV4 address*/
    };
sa_family_t是一个无符号短整型(unsigned short)。
in_addr_t数据类型必须是一个至少32位的无符号整数类型,
in_port_t必须是一个至少16位的无符号的整数类型。

IPv6地址用sockaddr_in6结构体表示,包括16位端口号、128位IP地址和一些控制
字段。UNIX Domain Socket的地址格式定义在sys/un.h中,用sockaddr_un结构体
表示。各种socket地址结构体的开头都是相同的,前16位表示整个结构体的长度
(并不是所有UNIX的实现都有长度字段,如Linux就没有),后16位表示地址类型。
IPv4、IPv6和UNIX Domain Socket的地址类型分别定义为常数
AF_INET、AF_INET6、AF_UNIX。这样,只要取得某种sockaddr结构体的首地址,
不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构
体中的内容。因此,socket API可以接受各种类型的sockaddr结构体指针做参数,
例如bind、accept、connect等函数,这些函数的参数应该设计成void *类型以便
接受各种类型的指针,但是sock API的实现早于ANSI C标准化,那时还
没有void *类型,因此这些函数的参数都用struct sockaddr *类型表示,即通用
地址结构,如下所示:
    struct sockaddr {  
            uint8_t      sa_len;  
            sa_family_t  sin_family;  
            char         sa_data[14];  


    };  


[解决办法]
参考:
http://www.arey.cn/?p=11
    #define sockaddr_storage __kernel_sockaddr_storage  
    #define _K_SS_MAXSIZE   128 /* Implementation specific max size */  
    struct __kernel_sockaddr_storage {  
        unsigned short  ss_family;      /* address family */  
        /* Following field(s) are implementation specific */  
        char        __data[_K_SS_MAXSIZE - sizeof(unsigned short)];  
                    /* space to achieve desired size, */  
                    /* _SS_MAXSIZE value minus size of ss_family */  
    } __attribute__ ((aligned(_K_SS_ALIGNSIZE)));   /* force desired alignment */  

新的寻址结构对IPv4和IPv6均是适用的。

热点排行