####socket网络编程接口
socket的地址是结构体sockaddr
代码如下
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
sa_family 成员是地址族类型(sa_family_t)变量。
地址族类型通常与协议族类型对应
1.二者对应表
协议族
地址表
描述
PF_UNIX
AF_UNIX
UNIX本地域协议族
PF_INET
AF_INET
TCP/IPv4协议族
PF_INET6
AF_INET6
TCP/IPv6协议族
二者定义在bits/socket.h头文件,值一样,所以二者经常混用
sa_data成员用于存放socket地址值
但是不同的协议族的地址值具有不同的含义和长度
2.协议族及其地址值
地址值含义和长度
文件的路径名,长度可达108字节
16bit 端口号和32bit IPv4地址
16bit 端口号,32bit流标识,128bitIPv6地址,32bit范围ID,共26字节
問題:14字节的sa_data无法容纳多数协议族的地址值,因此linux定义了新的通用socket地址结构体
struct sockaddr_storage{
ssalign:用于内存对齐
3.专用socket地址
问题: 上述通用结构体很不好用,设置与获取IP地址和端口号需要执行繁琐的位操作。
解决:linux为各个协议族提供了专门的socket地址结构体
3.1
UNIX本地域协议族:
struct sockaddr_un{
sa_family_t sin_family; //地址族AF_UNIX
char sun_path[108]; // 文件路径名