struct sock_addr 和struct sock_addr_in的区别与联系

一、数据结构

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值