[UNP]:套接字地址结构
本文将会重点介绍IPV4相关内容,IPV6的内容将不予涉及, 以下涉及到的函数以及结构默认都是IPV4, POSIX规范
1. 套接字地址结构
该结构定义在<netinet/in.h>中
sockaddr_in
1
2
3
4
5
6
7
8
9
10
11
12
13// IPv4套接字地址结构:sockaddr_in
#include <netinet/in.h>
struct in_addr {
in_addr_t s_addr; /* 32bit IPv4 address. */
};
struct sockaddr_in {
uint8_t sin_len; /* length of structure (16) */
sa_family_t sin_family; /* AF_INET */ // 协议族
in_port_t sin_port; /* 16bit TCP/UDP port number */ // 端口号
struct in_addr sin_addr; /* 32bit IPv4 address */ // IPV4地址
char sin_zero[8]; /* unused */
};对于POSIX规范,只需要给定三个字段即可:
sin_family,sin_addr,sin_port在初始化时,会将这些字段都置为0
数据类型

2. 通用套接字地址结构
当一个套接字函数接受一个套接字地址结构时,通常要使用通用套接字地址结构来进行类型强转,这样它们才能够接受来自不同协议的套接字地址结构
该结构定义在头文件<sys/socket.h>中
sockaddr
1
2
3
4
5
6// 通用套接字地址结构:sockaddr
#include <sys/socket.h> struct sockaddr {
uint8_t sa_len; /* length of structure */
sa_family_t sa_family; /* address family: AF_XXXX value */
char sa_data[14]; /* protocol-specific address */
};常见用法
1
bind(sockfd, (struct sockaddr*) &serv, sizeif(serv));可以看出,该结构唯一的作用就是类型强转
新通用套接字地址结构
上面的通用地址结构出现的比较早,后面IPV6相关API中包含了新的通用套接字地址结构
sockaddr_storage
1
2
3
4
5
6// 通用套接字地址结构:sockaddr
#include <sys/socket.h> struct sockaddr {
uint8_t sa_len; /* length of structure */
sa_family_t sa_family; /* address family: AF_XXXX value */
... /* 一些协议相关字段 */
};该结构相对于旧结构,有以下优点:
- 满足任何套接字地址结构对齐要求
- 足够大,可以容纳任何套接字地址结构
后面的协议相关字段不能通过结构体成员进行访问,只能通过获取相对应的字节偏移量进行访问
3. 地址结构比较

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!