读书人

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

发布时间: 2013-08-09 15:16:24 作者: rapoo

求一个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均是适用的。

读书人网 >C语言

热点推荐