千家信息网

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

发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,####socket网络编程接口socket的地址是结构体sockaddr代码如下struct sockaddr{sa_family_t sa_family;char sa_data[14];}sa_
千家信息网最后更新 2025年12月04日linux 高性能读书笔记之通用socket地址

####socket网络编程接口
socket的地址是结构体sockaddr
代码如下
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
sa_family 成员是地址族类型(sa_family_t)变量。
地址族类型通常与协议族类型对应
1.二者对应表

协议族地址表描述
PF_UNIXAF_UNIXUNIX本地域协议族
PF_INETAF_INETTCP/IPv4协议族
PF_INET6AF_INET6TCP/IPv6协议族

二者定义在bits/socket.h头文件,值一样,所以二者经常混用

sa_data成员用于存放socket地址值
但是不同的协议族的地址值具有不同的含义和长度

2.协议族及其地址值
协议族地址值含义和长度
PF_UNIX文件的路径名,长度可达108字节
协议族地址值含义和长度
PF_INET16bit 端口号和32bit IPv4地址
PF_UNIX文件的路径名,长度可达108字节
PF_INET616bit 端口号,32bit流标识,128bitIPv6地址,32bit范围ID,共26字节

問題:14字节的sa_data无法容纳多数协议族的地址值,因此linux定义了新的通用socket地址结构体
struct sockaddr_storage{

    sa_family_t sa_family    unsigned long int __sa_align;    char __ss_padding[128-sizeof(__ss_align)];

}

ssalign:用于内存对齐

3.专用socket地址
问题: 上述通用结构体很不好用,设置与获取IP地址和端口号需要执行繁琐的位操作。
解决:linux为各个协议族提供了专门的socket地址结构体
3.1
UNIX本地域协议族:
struct sockaddr_un{
sa_family_t sin_family; //地址族AF_UNIX
char sun_path[108]; // 文件路径名

    }    TCP/IP协议族有了两个专用    struct socketaddr_in{            sa_family_t sin_family; //地址族AF_INET            u_int16_t sin_port;    //端口号,要用网络字节序表示        struct in_addr  sin_addr;    //Ipv4地址结构体    }    struct in_addr{                        u_int32_t   s_addr;//IPv4地址,要用网络字节序表示    }    struct socketaddr_in6{            sa_family_t sin6_family; //地址族AF_INET            u_int16_t sin6_port;    //端口号,要用网络字节序表示            u_int32_t sin6_flowinfo;    //流信息,设置为0        struct in6_addr  sin6_addr;    //Ipv6地址结构体        u_int32_t sin6_scope_id;     //scope_id实验用    }    struct in6_addr{                        unsigned  char sa_addr[16];//IPv6地址,要用网络字节序表示    }    使用说明:所有专用地址类型的变量在实际使用中都需要转化为通用socket地址类型sockaddr(强制转换)    原因:所有的socket变成接口使用的地址参数的类型为sockaddr    4.IP地址转换函数    IPv4:点分十进制字符串    IPv6:16进制字符串    in_addr_t inet_addr  (const  char * strptr);    int  inet_aton(const   char * cp,  struct  in_addr  *  inp);    char *  inet_ntoa(struct  in_addr  in);
地址 字节 类型 结构 口号 网络 长度 文件 含义 路径 路径名 专用 不同 变量 字符 字符串 成员 接口 繁琐 不好 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 linux数据库中文乱码 华为可信软件开发考试答案 吴忠市软件开发公司联系电话 com域服务器 联想服务器rs260参数 邮箱登录显示请检查服务器信息 shell服务器怎么搭建 需要紧急连接网络访问公司服务器 阿里巴巴使用的数据库 关于网络安全的一副画 魔兽游戏一直在登录服务器状态 上海夺汇网络技术有限公司干啥的 湖北计算机应用软件开发报价 武汉网络技术大楼 2021年国际网络安全事件 用数据库统计广告位出租 大学信息与网络技术基础书 慧连接提示与服务器的连接已断开 第六届大学生网络安全大赛 网络安全知识普法新闻稿 烽火服务器如何组raid 亳州专业电商进销存软件开发费用 计算机 网络技术自我介绍 美国科技互联网公司 vba中选中最后一行数据库 中国电信酒店网络安全 闪耀暖暖各个服务器可以连通吗 在数据库应用中函数指的是什么 sqllite选择数据库 网络安全文章高中
0