您的位置:首页 > 运维架构 > Linux

ZZ: linux IPV4 IPV6 sockaddr 几个结构体及其关系: sockaddr sockaddr_in sockaddr_in6

2013-12-02 20:41 786 查看
1

struct sockaddr {

sa_family_t
sa_family; /* address family, AF_xxx*/

char sa_data[14];/* 14 bytes of protocol address*/

};

这个结构体是IP4 IP6通用的,但是但看结构体长度好像只适合IPV4

2

struct sockaddr_in {

__kernel_sa_family_t sin_family;/* Address family*/

__be16 sin_port;/* Port number*/

struct in_addr
sin_addr;/* Internet address*/

/* Pad to size of `struct sockaddr'. 补充到16个字节长度 */

unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -

sizeof(unsigned short int) - sizeof(struct in_addr)];

};

这个结构体是IPV4特有的sockaddr,其中port是端口, sin_addr指的是IP4地址,WORD32类型。本质上这个结构体同sockaddr是一样的,但是为了编程的方便操作,可以理解为sockaddr的逻辑实现。

任何时候都可以做如下强制转换。

sockckaddr_in Ipv4sockaddr;

xxxx

sockaddr *p = (sockaddr *)&Ip4sockaddr;

其中

struct in_addr {

__be32
s_addr;

};

3

struct sockaddr_in6 {

unsigned short intsin6_family; /* AF_INET6 */

__be16
sin6_port; /* Transport layer port # */

__be32
sin6_flowinfo; /* IPv6 flow information */

struct in6_addrsin6_addr; /* IPv6 address */

__u32 sin6_scope_id; /* scope id (new in RFC2553) */

};

这个结构式IPV6 对sockaddr逻辑实现,同样可以在相关接口进行强制转换。

其中

struct in6_addr {

union {

__u8 u6_addr8[16];

__be16
u6_addr16[8];

__be32
u6_addr32[4];

} in6_u;

#define s6_addr
in6_u.u6_addr8

#define s6_addr16
in6_u.u6_addr16

#define s6_addr32
in6_u.u6_addr32

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: