一、数据结构
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