struct sock_addr 和struct sock_addr_in的区别与联系

来源:互联网 发布:网络视频广告收入 编辑:程序博客网 时间:2024/06/16 04:50

一、数据结构

1.用户态的数据结构

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'. */
  unsigned char __pad[8];
};

注:__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(struct in_addr) = 8;

2.内核态数据结构

struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx*/
char sa_data[14];/* 14 bytes of protocol address*/
};

二、联系

用户态和内核态的数据结构是对应的,那么他们之间的联系就是在sockaddr中的char sa_data[14]中,前两个字节代表sockaddr_in中的 16位sin_port(端口),紧接着的四个字节代表sockaddr_in中的sin_addr(ip地址),为了保持二者之间的长度相同,则会在用户态的sockaddr_in中的最后加0补齐(14补齐)。

即如下关系
struct sockaddr_in {  
short            sin_family;       // 2 bytes e.g. AF_INET, AF_INET6  
unsigned short   sin_port;    // 2 bytes  e.g. htons(3490)  
struct in_addr   sin_addr;     // 4 bytes see struct in_addr, below  
char             sin_zero[8];     // 8 bytes zero for alignning to kernel's sockaddr structure  
}; 
so there is to be a map: bytes(port) : bytes(ip addr): bytes(aligned zeros) = 2:4:8
|------|------------|------------------------|
   port   ip addr    aligned zeros

0 0