qt socket 传递结构体 结构体中有list_通过Unix套接字传递文件描述符

发布时间:2021-07-31 04:08:31





以前学*Unix套接字的时候,了解与TCP、UDP网络套接字有一个很特别的不同点,就是Unix套接字能够通过辅助数据传输文件描述符。通过这个特性,原本没有父子关系的进程也能使用匿名资源(例如匿名管道),或者访问到进程原本没有权限访问的资源。







Snap中的进程间通信

最*学*Google在SOSP 2019发表的论文《Snap: A Microkernel Approach to Host Networking》收获很多,其中提到如何高效地在进程间通信,Snap在控制通道使用Unix套接字通信,如果要进行数据通信,则会使用共享内存技术,其中基于tmpfs的文件描述符通过Unix套接字的RPC响应中交换。打算分两篇文章去展开,第一篇先介绍通过Unix套接字传递文件描述符,第二篇介绍共享内存的部分。


系统调用API

发送消息的系统调用主要有send、sendto和sendmsg三个,其中sendmsg可以发送辅助控制信息。类似得,接收消息的系统调用主要有recv、recvfrom和recvmsg三个,其中recvmsg可以接收辅助控制信息。



ssize_t

其中,msg结构体的组成如下所示:



struct

msg_name和msg_namelen用于指定接收地址,一般用在无连接的套接字,有连接的套接字指定为NULL和0即可。msg_iov和msg_iovlen用于指定发送或接收的(多个)消息缓冲,虽然不是本文主要讨论范围,如果消息本身有一定的块结构(例如消息头部和消息体),这个机制可以减少用户态中内存的拷贝。msg_control和msg_controllen用于传输辅助数据,本文下面再展开。msg_flags在recvmsg中可以一些额外的行为。


辅助控制数据

根据cmsg(3)文档的介绍,辅助控制数据可以用于:


接收方获取接收报文的网络接口(IP_PKTINFO选项,仅适用于面向datagram的套接字)接收IP等协议的头部信息,例如IP_RECVTTL选项获取IP_TTL信息和IP_RECVTOS选项获取IP_TOS信息接收扩展的错误描述,主要指的是IP_RECVERR选项发送或接收文件描述符,使用SCM_RIGHTS消息类型,下面展开讨论发送或接收机密信息(指进程的uid/gid等),使用SCM_CREDENTIALS消息类型,用于认证访问的进程

其中,前面3个在开启指定IP套接字选项后就能通过recvmsg获取对应的辅助信息,后面2个仅适用于Unix套接字,并且cmsg_level为SOL_SOCKET(下面介绍)。


辅助控制数据实际上是cmsghdr结构体的序列,序列中结构体的数量对应msghdr的msg_controllen,而序列的首地址对应msghdr的msg_control字段。cmsghdr结构体的形式如下:



struct

按照cmsg(3)文档的介绍,由于结构体中有内存对齐的需求,建议通过宏进行操作:



#include

接收辅助信息后,可通过CMSG_FIRSTHDR和CMSG_NXTHDR顺序获取cmsghdr结构体,通过CMSG_DATA获取具体的数据指针。


发送方构造辅助信息,最重要知道缓冲所需长度。首先用CMSG_SPACE根据payload大小计算出单条消息所需的空间,然后把所有消息的Space大小加起来,使用CMSG_ALIGN计算出内存对齐后的缓冲大小。



char

由于这些宏是常量表达式,因此可以有上面这种编译时指定缓冲大小的用法。发送方指定cmsghdr的cmsg_len字段时,还需要用到CMSG_LEN宏。


传递文件描述符

说到这里,应该可以理解传递文件描述符的过程就是发送辅助信息和接收辅助信息。具体来说,cmsg_level设置为SOL_SOCKET,cmsg_type设置为SCM_RIGHTS,而cmsg_data设置为文件描述符数组(即int数组)。







传递文件描述符

有一点值得注意,发送方的fd和接收方得到的fd不需要相同的值,例如发送方的fd是3,而接收方得到的fd是4。可以认为接收方新增了一个fd,因此也受到文件描述符资源限制等。


Unix套接字地址

由于实现的时候踩过坑,也在这里记录一下Unix套接字地址的注意事项。Unix套接字地址分为传统基于文件系统路径的地址和abstract抽象地址。无论哪种地址,切记指定大小的时候(例如bind)不要使用sockaddr_un结构体的全部大小


对于基于文件系统路径的地址,sun_path字段使用NULL结尾字符串,所以总体的地址大小就是sun_path字段之前的大小加上字符串的长度(包括NULL):



offsetof

对于抽象地址,sun_path数组第0字节需要置为NULL,后面的字符串不需要NULL结尾(因此不要使用strlen)。因此,总体地址大小是sun_path字段之前的大小加上sun_path字段用到的字节数。


抽象地址的好处是该地址的生命周期与应用的生命周期一致,不需要额外做一些删除的动作。


小结

本文介绍了Unix套接字如何发送和接收辅助控制数据,特别是文件描述符。通过这个机制,进程可以访问到匿名资源或没有直接权限的资源。在Snap中,服务进程将内存fd传递到客户进程,实现按需的内存共享机制,具体方式在下一篇文章中展开,敬请期待!

相关文档

  • 买卖合同通用外贸购货合同
  • 人工智能未来的相关论文
  • 以最有意义的事话题作文精选
  • 三分钟即兴演讲经典技巧
  • 程序员的996
  • 超分辨率重构之SRCNN整理总结(四)
  • workbench mesh划分边界层网格
  • stonehenge是什么牌子?stonehenge在韩国是什么档次?
  • 吃胎盘不仅无益反有健康风险
  • 数学五年级考试试卷
  • 适合在旅途听的歌曲排行榜
  • 计算机组成原理平均cpi怎么算_2020考研 | 计算机统考408院校盘点,408考试内容难易分析...
  • usboot消除tf卡写保护
  • 全国推广普通话宣传周活动总结范本
  • restFul面试题
  • sql:函数:right() (从右往左截取字符)
  • HTTP 错误 404.3 ? Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。...
  • 瑜伽中的六大基本动作
  • 鸡蛋和土豆能不能放在一起煮着吃
  • 宏基因组分析流程报错与解决
  • android 动态设置TextView字体大小
  • 荷叶茶什么时候喝最好
  • 谜语上屋救火打一成语的答案
  • Linux 配置Node环境变量
  • MySQL的安装与卸载教程
  • 苹果手机软件获取不了怎么办
  • 书法家勤学苦练的故事(简短)
  • 曲阜经济怎么样
  • 怎样用枣和糯米制作“开口笑”
  • 介绍一位超级大美女
  • 猜你喜欢

  • 有效教学从找准学生的认识起点开始
  • 不约而同的意思和造句_不约而同是什么意思
  • 2019届高考历史一轮复*第1单元第1讲夏商周的政治制度和秦始皇建立中央集权制度考点探究练*北师大版必修1
  • 教科小学科学四上《26、100毫升水能溶解多少食盐》教案(2)
  • 禾花香打造正宗川湘风味健康快餐知名品牌
  • 质量和密度(物理中考复习课件)(654K)资料
  • 无线视频监控系统传感解决方案
  • 五年级语文下册期中复*资料:词语解释英语教案
  • 安全文明施工措施费使用计划表 (1)
  • 电除尘系统原理及故障处理方法
  • 一非参数经验贝叶斯估计共57页文档
  • 脆山药怎么做菜好吃***2***
  • client server runtime process是什么_什么是Appium?
  • 八年级地理下册第五章中国的地理差异课件(2)(新版)新人教版
  • 浅谈静脉留置针常见并发症的发生原因与预防
  • “Π”型刚性悬挂接触网特点
  • 苹果怎么把键盘换黑色
  • 2016网易前端实习生面经
  • 息思比丘的故事
  • 2016年湖北教师招聘面试指导:细节决定成败
  • 基于遗传算法的欠驱动机械臂优化控制研究
  • 家乡礼赞(石嘴山)
  • 下列关于货币市场基金的收益分配,说法错误的有( )。 A.投资者于周五
  • 山东省曲阜师范大学附属中学2014届九年级上学期期末调研测试英语试题(扫描版)(附答案)
  • 想给孩子报个靠谱的辅导班应该选哪家
  • 人教PEP四年级下册Unit3__B__Let’s__talk教学课件
  • 北京地铁车站结构抗震分析
  • 冬季嘴唇干裂的原因和护唇技巧
  • 2013-2014学年高一数学上学期期末考试试题及答案(新人教A版 第7套)
  • it8511a+的负载仪使用说明书_测线仪的故障符号及说明
  • (最新)常用房地产企业财务分析的指标-韩磊
  • 阿立哌唑对精神分裂症患者的临床症状和生活质量的改善
  • 2016年北京市春季高中会考英语试卷(包含答案解析)
  • 将阳光留在夜晚
  • 七年级地理下册8.3撒哈拉以南非洲课件新版新人教版一
  • 2018年承德市房地产未来发展趋势分析及投资规划建议研究(目录)
  • 第八章网络营销PPT课件
  • 新时期我国行政管理体制改革二题
  • 安徽省居民消费影响因素的实证分析
  • 急性心肌梗死患者的临床表现及护理
  • 大学里永远不要做的十件事
  • php转换byte[]数据类型
  • 电脑版