23,121
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
struct sockaddr {
uint8_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
struct in6_addr {
union {
char __u6_addr8[16];
} __u6_addr; /* 128-bit IP6 address */
};
struct sockaddr_in6 {
unsigned short int sin6_family; /* AF_INET6 */
uint16_t sin6_port; /* Transport layer port # */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* scope id (new in RFC2553) */
};
int main(int argc, const char * argv[])
{
struct sockaddr_in6 sk_in6;
std::cout<<"size of sin6_family = "<<sizeof(sk_in6.sin6_family)<<std::endl;
for(int i = 0;i < 16;++i){
sk_in6.sin6_addr.__u6_addr.__u6_addr8[i] = '3';
}
for(int i = 0;i < 16;++i){
std::cout<<sk_in6.sin6_addr.__u6_addr.__u6_addr8[i]<<std::endl;
}
std::cout<<"---------"<<std::endl;
struct sockaddr *_sockaddr = (sockaddr*)&sk_in6;
struct in6_addr *_in6_addr = (in6_addr*)&_sockaddr->sa_data[7];
for(int i = 0;i < 16;++i){
std::cout<<_in6_addr->__u6_addr.__u6_addr8[i]<<std::endl;
}
return 0;
}
特意写了这么一段代码来说明这个问题,相信看完就差不多明白为什么14字节能装下16字节的地址。起始根本不是装下的,只是能通过sa_data[7]来取到v6地址的首地址,即偏移量。有了偏移量就可以转回来。AF_INET6这个参数传进去之后,会用V6的逻辑来处理sockaddr这个通用套接字地址结构体。