当前位置: 技术问答>linux和unix
sockaddr 和sockaddr_in6的转换问题
来源: 互联网 发布时间:2017-05-19
本文导语: 几个结构体定义是这样的: struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol add...
几个结构体定义是这样的:
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
struct sockaddr_in {
sa_family_t sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};
struct sockaddr_in6 {
unsigned short int sin6_family; /* AF_INET6 */
__u16 sin6_port; /* Transport layer port # */
__u32 sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
__u32 sin6_scope_id; /* scope id (new in RFC2553) */
};
sockaddr_in同sockaddr 相互转换好理解,
我迷惑的是,sockaddr 和sockaddr_in6所占的位数不同,大小不一样,为什么能相互转换?
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
struct sockaddr_in {
sa_family_t sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};
struct sockaddr_in6 {
unsigned short int sin6_family; /* AF_INET6 */
__u16 sin6_port; /* Transport layer port # */
__u32 sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
__u32 sin6_scope_id; /* scope id (new in RFC2553) */
};
sockaddr_in同sockaddr 相互转换好理解,
我迷惑的是,sockaddr 和sockaddr_in6所占的位数不同,大小不一样,为什么能相互转换?
|
p==q,因为p和q都是指针变量,存储一个4字节的地址而已,我可以把那个地址开始的内存当做4字节的,也可以当做8字节的double,当然这个例子不太合适,因为如果当做8字节的double会越界int a。
这一段和例子说的不对,改成这样:
int a;
int *p=&a;
double *q=(double*)&a;
然后理解那一段话,a所在的内存本来只有4字节合法,当做double会越界4字节,当然Int刚合适。
对于sockaddr,不会有越界问题,因为是传进去地址,根据family决定那个地址里存得到底是什么结构体。