unix 域套接字实现进程间通信

news2024/11/19 5:33:08

         目录

1、认识域套接字

2、unix域套接字相关API及地址结构介绍

(1) 创建unix域套接字

(2) 填充地址结构 sockaddr_un

3、unix域套接字实现进程间通信(以UDP为例)


1、认识域套接字

和之前TCP / UDP 编程使用的套接字不同,域套接字常用于同一台主机上的两个进程之间的通信,如前后台进程之间的通信。其本质是让两个进程可以访问到同一个unix套接字文件,只不过这个套接字文件必须由OS系统创建的,而并非我们手动创建。

和其他进程间通信方式相比,unix域套接字使用更方便、效率更高。

  • 易用性:消息队列 > unix域套接字 > 管道 > 共享内存(常常需要搭配信号量)
  • 效率:共享内存 > unix域套接字 > 管道 > 消息队列

2、unix域套接字相关API及地址结构介绍

unix域套接字使用的API 和 inet 套接字是一样的,在使用unix套接字前,需要决定是使用UDP协议还是TCP协议,协议的不同,填入的参数也会不同。

(1) 创建unix域套接字

socket函数的声明如下:

第一个参数 domain:填写的是 AF_UNIX 或者 AF_LOCAL

第二个参数 type:套接字类型。数据报套接字(UDP) 填的是 SOCK_DGRAM;流式套接字(TCP) 填的是 SOCK_STREAM。

第三个参数 protocol:协议类型。一般填 0。

返回值:成功返回套接字文件描述符,失败返回 -1

// UDP协议
socket(AF_LOCAL, SOCK_DGRAM, 0);

// TCP协议
socket(AF_LOCAL, SOCK_STREAM, 0);

(2) 填充地址结构 sockaddr_un

我们在发送数据(send/sendto)bind函数绑定地址的时候,都会需要填充地址结构,但是填充的不是IP地址,而是unix套接字文件所在路径。地址结构的定义如下:

#define UNIX_PATH_MAX    108             // 该值可能会随系统变化(98~108)

struct sockaddr_un {
    sa_family_t sun_family;               // AF_UNIX
    char        sun_path[UNIX_PATH_MAX];  // 套接字文件所在路径
                                          // 该套接字文件不可手动创建,服务端在绑定的时候会自动创建
                                          // 填写的路径必须是绝对路径
};

注意:套接字文件无需我们手动创建,服务端在绑定的时候会自动创建。填充地址结构的目的是告诉OS,我们希望把套接字文件放哪以及套接字文件叫啥。

// 1. bind函数会自动创建套接字文件,必须要保证套接字文件不存在
if(!access(UNIX_DOMAIN_FILE, F_OK)) {
    unlink(UNIX_DOMAIN_FILE);
}

// 2. 填充sockaddr_un 地址结构
struct sockaddr_un sun;
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_LOCAL;
strncpy(sun.sun_path, UNIX_DOMAIN_FILE, strlen(UNIX_DOMAIN_FILE)); 

3、unix域套接字实现进程间通信(以UDP为例)

(1) 服务端

// 最好放在一个头文件里,客户端和服务端同时引入这个文件
#define UNIX_DOMAIN_FILE /tmp/unix_socket

int fd = -1;
// 1. 创建基于UDP的unix域套接字
if ((fd = socket (AF_LOCAL, SOCK_DGRAM, 0)) < 0) {
    perror ("socket");
    exit (1);
}

// 2. 判断UNIX_DOMAIN_FILE所指向的文件是否存在,如果存在,则删除
if(!access(UNIX_DOMAIN_FILE, F_OK)) {
    unlink(UNIX_DOMAIN_FILE);
}

// 3. 填充sockaddr_un 地址结构
struct sockaddr_un sun;
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_LOCAL;
strncpy(sun.sun_path, UNIX_DOMAIN_FILE, strlen(UNIX_DOMAIN_FILE));

// 4. 服务端绑定地址
if (bind (fd, (struct sockaddr*) &sun, sizeof(sun)) < 0) {
    perror ("bind");
    exit (1);
}

(2) 客户端

// 最好放在一个头文件里,客户端和服务端同时引入这个文件
#define UNIX_DOMAIN_FILE /tmp/unix_socket      

int fd = -1;
// 1. 创建基于UDP的unix域套接字
if ((fd = socket (AF_LOCAL, SOCK_DGRAM, 0)) < 0) {
    perror ("socket");
    exit (1);
}

// 2. 判断UNIX_DOMAIN_FILE所指向的文件是否存在,如果存在,则删除
if(!access(UNIX_DOMAIN_FILE, F_OK)) {
    unlink(UNIX_DOMAIN_FILE);
}

// 3. 填充sockaddr_un 地址结构
struct sockaddr_un sun;
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_LOCAL;
strncpy(sun.sun_path, UNIX_DOMAIN_FILE, strlen(UNIX_DOMAIN_FILE));

// 4. 发送数据
std::string msg = "hello";
sendto(fd, msg.c_str(), msg.size(), 0 ,(struct sockaddr*)&sun, sizeof(sun));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01入门及简单应用-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录1 概述2 性质3 简单测试4 模拟数据缓存4.1 应用初始化无缓存4.2 加入缓存改造5 后记1 概述 ReentrantReadWriteLock 是读写锁&#xff0c;和ReentrantLock会有所不同&#xff0c;对于读多写少的场景使用ReentrantReadWriteLock 性能会比ReentrantLock高出不少。在多线程…

技术分享 | 测试平台开发-前端开发之数据展示与分析

测试平台的数据展示与分析&#xff0c;我们主要使用开源工具ECharts来进行数据的展示与分析。 ECharts简介与安装 ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff…

展锐Android 10平台OTA升级

OTA 整体升级包制作步骤&#xff08;以SC9863A平台为例&#xff09; 下载项目 AP 的代码。通过以下命令设置编译环境。 source build/envsetup.sh lunch kheader 通过 make 命令全编整个工程。进入“device/sprd/sharkle/sl8541e_1h10_32b/”目录&#xff08;board 对应目录&a…

5G无线技术基础自学系列 | 站点详细勘测

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 站点的勘测结果非常重要&#xff0c;直…

高压放大器在硅氧烷近晶相单体合成中的应用

实验名称&#xff1a;高压放大器在硅氧烷近晶相单体合成中的应用 研究方向&#xff1a;晶体材料 测试目的&#xff1a; 双稳态包括向列相双稳态、近晶&#xff21;相双稳态和胆甾相双稳态&#xff0c;目前主要的研究是在近晶&#xff21;相双稳态&#xff0c;由近晶&#xff21…

自动驾驶专题介绍 ———— 转向系统

文章目录转向系统转向器齿轮齿条式循环球式蜗杆曲柄指销式转向助力液压转向助力系统电动转向助力系统发展转向系统 转向系统是按照驾驶员的意图改变或保持汽车行驶方向的系统。根据转向能源的不同&#xff0c;可以将转向系统分为机械转向系统和动力转向系统。   1. 机械转向系…

188: vue+openlayers上传GeoJSON文件,导出CSV格式文件

第188个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers上传geojson文件,解析文件在地图上显示图形,同时利用上传的文件,获取features数据,整合重新配置格式,导出CSV(Comma Separated Values)形式的文件。如果文件仅包含点要素,则会添加经度和纬度列。 …

能源管理系统的主要功能|瑜岿科技|能源监测

能源管理系统利用过程控制技术、网络通信技术、教据库技术将分布在现场的数据采集监测站、现场控制站以及管理控制中心联系了起来&#xff0c;实现对企业生产数据采集、存储、处理、统计、查询及分析的功能&#xff0c;以及对企业生产数据的监控、分析和诊断&#xff0c;通过对…

Dynamic Few-Shot Visual Learning without Forgetting

摘要 人类视觉系统有显著的能力去毫不费力的从零样本示例中学习新颖概念。机器学习视觉系统上模仿相同的行为是一个有趣的非常具有挑战性的研究问题&#xff0c;这些研究问题有许多实际的优势在真实世界视觉应用上。在这篇文章中&#xff0c;我们目标是去设计一个零样本视觉学…

mysql中MVCC--多版本并发控制

读读:不存在任何安全问题&#xff0c;不需要并发控制 读写:有线程安全问题&#xff0c;脏读、幻读、不可重复读 写写:有线程安全问题&#xff0c;更新丢失 为了解决读写的并发问题 什么是MVCC 只有InnoDB引擎支持mvcc&#xff0c;mysql默认支持可重复读&#xff0c;就是依赖…

常用数据库之mysql的搭建与使用

1. 简介 mysql为关系型数据库&#xff0c;是由瑞典的MySQLAB公司开发的&#xff0c;但是几经辗转&#xff0c;现在是Oracle产品。它是以“客户&#xff0f;服务器”模式实现的&#xff0c;是一个多用户、多线程的小型数据库服务器。而且MySQL是开源数据的&#xff0c;任何人都可…

Qt 模型视图编程之自定义只读数据模型

背景 Qt 中的模型视图架构是用来实现大量数据的存储、处理及其显示的&#xff0c;主要原理是将数据的存储与显示分离&#xff1a;模型定义了标准接口对数据进行访问&#xff1b;视图通过标准接口获取数据并定义显示方式&#xff1b;模型使用信号与槽机制通知视图数据变化。 Q…

基于Java Web技术的动车购票系统

毕 业 设 计 中文题目基于Java Web技术的动车购票系统英文题目Train ticket system based on Web JavaTechnology毕业设计诚信声明书 本人郑重声明&#xff1a;在毕业设计工作中严格遵守学校有关规定&#xff0c;恪守学术规范&#xff1b;我所提交的毕业设计是本人在 指导教师…

零入门容器云网络-7:基于golang编程实现给ns网络命名空间添加额外的网卡

已发表的技术专栏&#xff08;订阅即可观看所有专栏&#xff09; 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

“美亚杯”第三届中国电子数据取证大赛答案解析(个人赛)

试题 1 Gary的笔记本电脑已成功取证并制作成镜像 (Forensic Image)&#xff0c;下列哪个是其MD5哈希值。 A. 0CFB3A0BB016165F1BDEB87EE9F710C9 B. 5F1BDEB87EE9F710C90CFB3A0BB01616 C. A0BB016160CFB3A0BB0161661670CFB3 D. 16160CFB3A0BB016166A0BB0161661…

独立产品灵感周刊 DecoHack #041 - 那些独立开发者是怎么养活自己的

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 &#x1f4bb; 产品推荐 1. SOCCER STREAM…

分布式的设计思想

一、分布式设计基础 传统架构问题 ① 单机资源不足 存储&#xff1a;3台机器&#xff0c;每台机器都有2T的硬盘空间&#xff0c;但是现在有1个3T的文件要存储计算&#xff1a;3台机器&#xff0c;每台机器都有8核CPU和8GB内存&#xff0c;但是现在有1个程序需要12核CPU和24G…

启明智显分享| Sigmastar SSD212 SPI+RGB点屏示例(2.1寸 480*480圆屏,可应用于旋钮)

SSD20X 点SPIRGB屏和SSD212 类似&#xff0c;区别在于对应文件名不同、SSD20X没有config.ini文件。 SSD20X SPI初始化文件&#xff1a;vi boot/common/cmd_customer_init.c SSD20X由于没有config.ini 可以用jpeg2disp 中.h 屏参头文件的方式实现显示logo。 这里以SSD212 点屏为…

Java——AVL树

平衡二叉树 在之前的blog中讲到&#xff0c;平衡二叉树是一棵树&#xff0c;任意一个节点的左树的所有节点都小于这个节点&#xff0c;右树的所有节点都大于这个节点 因此&#xff0c;可以利用这个性质来中序遍历&#xff0c;就可以得到一个有序的序列&#xff0c;而如果我们要…

谷歌地图商家抓取工具 G-Business Extractor 7.5

G 业务提取器 | 谷歌地图抓取工具 G-Business Extractor是一款功能强大的工具&#xff0c;可帮助您从 Google 地图中寻找商机。它是最好的Google Maps Scraper工具&#xff0c;能够从最重要的企业目录中提取数据。 Google 地图是一个来源&#xff0c;您可以在其中找到按类别和位…