3.2 地址信息的表示
2025/10/2大约 1 分钟
3.2 地址信息的表示
用于表示地址信息的struct
typedef unsigned short __kernel_sa_family_t;
typedef __kernel_sa_family_t sa_family_t;
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};| 行号 | 功能 | 说明 |
|---|---|---|
| 1、2 | address family 类型定义 | AF_INET, AF_INET6,。。。 |
| 5 | protocol address | 根据address family确定实际使用长度 |
用于表示AF_INET - ipv4 的struct
typedef unsigned short __u16;
typedef uint16_t __u16;
typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
/* Internet address. */
struct in_addr {
__be32 s_addr;
};
#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
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[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};| 行号 | 功能 | 说明 |
|---|---|---|
| 1-2 | 可移植类型定义 | 使用unsigned short 无法保证跨平台一致性,对于特定平台 或者 无法使用 uint16_t的使用 unsigned short 定义port 类型 |
| 3-4 | 字节序类型定义 | bitwise:标记类型,用于区分相同类型,但是字节序不同。即使使用的都是u16,但是经过bitwise 标记后两者实际是不同的类型。 由Sparse-linux内核用的静态分析工具定义,正常使用GCC 编译bitwise替换为空。使用Sparse 分析时对于字节序不同的类型对象混合使用时会报错。 be - Big Endian; le - Little Endian. |
| 7-9 | IP地址类型定义 | struct 中只包含了一个s_addr属性。 |
| 18-19 | 剩余填充的字节 | 为了和通用的地址结构保持一致,ipv4地址(2字节port + 4字节addr)不够14字节,要求值全部为0 |
问:为什么sin_addr 使用结构体定义类型,而不是直接使用 be32?