天天看点

linux 高性能读书笔记之通用socket地址

####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]; // 文件路径名

继续阅读