首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

sockaddr 和sockaddr_in6的转换有关问题

2014-01-23 
sockaddr 和sockaddr_in6的转换问题几个结构体定义是这样的:struct sockaddr {sa_family_tsa_family/* ad

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所占的位数不同,大小不一样,为什么能相互转换?
[解决办法]

引用:
引用:

但是对于struct sockaddr_in6来说,它要占28个byte,而struct sockaddr才占16个
引用:

struct sockaddr , 你看到 char sa_data[14];了吧,char可以在任意字节上对齐,所以 char sa_data[14];是紧邻sa_fa……


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决定那个地址里存得到底是什么结构体。

热点排行