17_高级进程间通信 UNIX域套接字1
非命名的UNIX域套接字
第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX;
第2个参数type,表示类型,只能为0。
第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。不管是数据流还是数据报协议,unix域套接字都是可靠的,不丢包的。
第4个参数,用于保存建立的套接字对。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>int main(void)
{ int i_fd_arr[2]; int i_pid; char psz_wbuf[16] = "0123456789";char psz_rbuf[16] = {0};if ( socketpair( AF_UNIX, SOCK_STREAM, 0, i_fd_arr ) < 0 ) { perror( "socketpair" );return -1;}if ( ( i_pid = fork() ) < 0 ) { perror( "fork" );return -1;} else if ( 0 == i_pid ) { //child close( i_fd_arr[0] ); if ( write( i_fd_arr[1], psz_wbuf, strlen( psz_wbuf ) ) < 0 ) {perror( "write" );exit( -1 );}memset( psz_rbuf, 0, sizeof( psz_rbuf ) );if ( read( i_fd_arr[1], psz_rbuf, 16 ) < 0 ) {perror( "read" );exit( -1 );}printf( "child read: %s\n", psz_rbuf );}else{ //parent close( i_fd_arr[1] ); if ( read( i_fd_arr[0], psz_rbuf, 16 ) < 0 ) {perror( "read" );exit( -1 );}printf( "parent read: %s\n", psz_rbuf );memset( psz_wbuf, 0, sizeof( psz_wbuf ) );strncpy( psz_wbuf, "9876543210", sizeof( psz_wbuf ) - 1 );if ( write( i_fd_arr[0], psz_wbuf, strlen( psz_wbuf ) ) < 0 ) {perror( "write" );exit( -1 );}}return 0;
}
命名UNIX域套接字
TCP示例:
server.c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <unistd.h>int main(void)
{ int i_listenfd = 0, i_clientfd = 0; struct sockaddr_un addr_server, addr_client; char psz_path[32] = "./server_unixsocket_file";int i_caddr_len = sizeof(struct sockaddr_un); int i_saddr_len = sizeof(struct sockaddr_un); char psz_rbuf[32] = {0}; char psz_wbuf[32] = "i am server.";int i_readlen = 0;//create a UNIX domain stream socket if ( ( i_listenfd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 ) { perror( "socket" );return -1;}//in case it already exists unlink( psz_path ); //fill in socket address structure memset( &addr_server, 0, sizeof( addr_server ) ); addr_server.sun_family = AF_UNIX;strncpy( addr_server.sun_path, psz_path, sizeof( addr_server.sun_path ) - 1 ); //bind the name to the descriptorif ( bind( i_listenfd, ( struct sockaddr * )&addr_server, i_saddr_len ) < 0 ) {perror( "bind" ); return -1; } if ( listen( i_listenfd, 10 ) < 0 ){ perror( "listen" );return -1;} while(1){if ( ( i_clientfd = accept( i_listenfd, ( struct sockaddr * )&addr_client,( socklen_t * )&i_caddr_len ) ) < 0 ) { perror("accept");return -1;} printf( "client is: %s\n", addr_client.sun_path ); if ( ( i_readlen = read( i_clientfd, psz_rbuf, sizeof( psz_rbuf ) - 1 ) ) < 0 ){perror( "read" );return -1;}psz_rbuf[i_readlen] = '\0';printf( "receive msg:%s\n", psz_rbuf ); if ( write( i_clientfd, psz_wbuf, strlen( psz_wbuf ) + 1 ) < 0 ) { perror("write"); return -1; }}unlink( psz_path ); return 0;
}
client.c
#include <stdio.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>int main(void)
{ int i_fd = 0; struct sockaddr_un addr; char psz_path[32] = "./client_unixsocket_file"; char serverpath[32] = "./server_unixsocket_file"; int i_addr_len = sizeof( struct sockaddr_un ); char psz_wbuf[32] = "i am client.";char psz_rbuf[32] = {0}; int i_readlen = 0;if ( ( i_fd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 ) { perror("socket");return -1;}memset( &addr, 0, sizeof( addr ) ); addr.sun_family = AF_UNIX;strncpy( addr.sun_path, psz_path, sizeof( addr.sun_path ) - 1 ); unlink( psz_path );if ( bind( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 ) { perror("bind");return -1;}//fill socket adress structure with server's address memset( &addr, 0, sizeof( addr ) ); addr.sun_family = AF_UNIX;strncpy( addr.sun_path, serverpath, sizeof( addr.sun_path ) - 1 ); if ( connect( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 ) {perror("connect");return -1;}if ( write( i_fd, psz_wbuf, strlen( psz_wbuf ) + 1 ) < 0 ) {perror( "write" ); return -1;} if ( ( i_readlen = read( i_fd, psz_rbuf, sizeof( psz_rbuf ) - 1 ) ) < 0 ) { perror("write"); return -1; }psz_rbuf[i_readlen] = '\0';printf( "receive msg:%s\n", psz_rbuf ); unlink( psz_path );return -1;
}
UDP示例:
server
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <unistd.h> int main(void)
{ int i_listenfd = 0/*, i_clientfd = 0*/; struct sockaddr_un addr_server, addr_client; char psz_path[32] = "./server_unixsocket_file"; int i_caddr_len = sizeof(struct sockaddr_un); int i_saddr_len = 0; char psz_rbuf[32] = {0}; char psz_wbuf[32] = "i am server."; int i_readlen = 0; //create a UNIX domain stream socket if ( ( i_listenfd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 ) { perror( "socket" ); return -1; } //in case it already exists unlink( psz_path ); //fill in socket address structure memset( &addr_server, 0, sizeof( addr_server ) ); addr_server.sun_family = AF_UNIX; strncpy( addr_server.sun_path, psz_path, sizeof( addr_server.sun_path ) - 1 ); //bind the name to the descriptor i_saddr_len = strlen( addr_server.sun_path ) + sizeof( addr_server.sun_family ); if ( bind( i_listenfd, ( struct sockaddr * )&addr_server, i_saddr_len ) < 0 ) { perror( "bind" ); return -1; } while(1) { i_readlen = recvfrom( i_listenfd, psz_rbuf, sizeof( psz_rbuf ) - 1, 0, ( struct sockaddr * )&addr_client, ( socklen_t *)&i_caddr_len ); if ( i_readlen < 0 ) { perror( "read" ); return -1; } printf( "client is: %s\n", addr_client.sun_path );psz_rbuf[i_readlen] = '\0'; printf( "receive msg:%s\n", psz_rbuf ); if ( sendto( i_listenfd, psz_wbuf, strlen( psz_wbuf ) + 1, 0, ( struct sockaddr * )&addr_client, i_caddr_len ) < 0 ) { perror( "write" ); return -1; } } unlink( psz_path ); return 0;
}
Client
#include <stdio.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>int main(void)
{ int i_fd = 0; struct sockaddr_un addr; char psz_clientpath[32] = "./client_unixsocket_file"; char psz_serverpath[32] = "./server_unixsocket_file"; int i_addr_len = 0; char psz_wbuf[32] = "i am client.";char psz_rbuf[32] = {0}; int i_readlen = 0;if ( ( i_fd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 ) { perror("socket");return -1;}memset( &addr, 0, sizeof( addr ) ); addr.sun_family = AF_UNIX;strncpy( addr.sun_path, psz_clientpath, sizeof( addr.sun_path ) - 1 ); unlink( psz_clientpath );i_addr_len = strlen( addr.sun_path ) + sizeof( addr.sun_family );if ( bind( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 ) { perror("bind");return -1;}//fill socket adress structure with server's address memset( &addr, 0, sizeof( addr ) ); addr.sun_family = AF_UNIX;strncpy( addr.sun_path, psz_serverpath, sizeof( addr.sun_path ) - 1 ); i_addr_len = strlen( addr.sun_path ) + sizeof( addr.sun_family ); if ( sendto( i_fd, psz_wbuf, strlen( psz_wbuf ) + 1, 0,( struct sockaddr * )&addr, i_addr_len ) < 0 ) {perror( "write" ); return -1;} if ( ( i_readlen = recvfrom( i_fd, psz_rbuf, sizeof( psz_rbuf ) - 1, 0,( struct sockaddr * )&addr, ( socklen_t * )&i_addr_len ) ) < 0 ) {perror("write"); return -1; }psz_rbuf[i_readlen] = '\0';printf( "receive msg:%s\n", psz_rbuf ); unlink( psz_clientpath );return -1;
}
示例代码抄录自:https://blog.csdn.net/bytxl/article/details/47861469
用于加深理解
相关文章:

17_高级进程间通信 UNIX域套接字1
非命名的UNIX域套接字 第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX; 第2个参数type,表示类型,只能为0。 第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…...

大型语言模型的生物医学知识图优化提示生成
大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架,较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…...
winform datagrid 全部勾选
如果我们想要进行全选或全部取消,在数据较多的情况下,这种方法显然特别繁琐。怎么办呢? 当然是加以一个全选按钮了,选中全选按钮则全选,否则取消。笔者本想在红色圆圈位置添加全选复选框的,那样看起来更加…...

从 NextJS SSRF 漏洞看 Host 头滥用所带来的危害
前言 本篇博文主要内容是通过代码审计以及场景复现一个 NextJS 的安全漏洞(CVE-2024-34351)来讲述滥用 Host 头的危害。 严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能…...

LC617-合并二叉树
文章目录 1 题目描述2 思路优化代码完整输入输出 参考 1 题目描述 https://leetcode.cn/problems/merge-two-binary-trees/description/ 给你两棵二叉树: root1 和 root2 。 将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另…...
深入解析:端到端目标检测模型的奥秘
深入解析:端到端目标检测模型的奥秘 在人工智能领域,计算机视觉任务一直是研究的热点之一。目标检测作为计算机视觉中的核心问题,其重要性不言而喻。端到端的目标检测模型,以其高效的性能和简洁的架构,逐渐成为研究和…...

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题
每次要将表格中的数据分成多级时,只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格,分成了4级 步骤: 1、我们可以先按照这个层级设置下空列(后买你会用到这个空列) 二级不用加、三级前面加一列、四级前面加…...

在 Android 上实现语音命令识别:详细指南
在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…...

怎么理解FPGA的查找表与CPLD的乘积项
怎么理解 fpga的查找表 与cpld的乘积项 FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)是两种常见的数字逻辑器件,它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表(LUT,L…...

51.2T 800G 以太网交换机,赋能AI开放生态
IB与以太之争 以太网替代IB趋势明显。据相关报告:2024年TOP500的超算中,采用以太网方案占比48.5%,InfiniBand占比为39.2%,其中排名前6的超算中已有5个使用以太网互联。 开放系统战胜封闭系统仅是时间问题。我们已经看到…...

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏
最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体,摩檫力0 轮胎添加碰撞体和刚体࿰…...
Spring Boot 注解 @PostConstruct 介绍
Spring Boot 注解 PostConstruct 介绍 文章目录 Spring Boot 注解 PostConstruct 介绍一、基本介绍二、PostConstruct 的执行时机Spring Bean 的生命周期PostConstruct 的确切执行时机执行顺序示例重要注意事项 三、使用场景及代码示例1. 初始化资源:比如打开数据库…...
深度学习环境配置报错解决日记
2024年7越24日 1、detectron2需要编译 首先需要在自己创建的虚拟环境中下载一下detectron2 conda create -n pytorch python3.9 conda activate pythorch git clone https://github.com/facebookresearch/detectron2.git 接下来就是编译环节: 在win系统中&…...

百度,有道,谷歌翻译API
API翻译 百度,有道,谷歌API翻译(只针对中英相互翻译),其他语言翻译需要对应from,to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…...
java-双亲委派机制
Java虚拟机(JVM)中的类加载器(Class Loader)负责将类(.class文件)加载到JVM中,以便Java程序能够使用这些类。在JVM中,类加载器被组织成一种层次结构关系,这种层次结构关系…...

【C++】set的使用
🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🌈关于set🔥容量函数emptysize 🔥Modifiersinserteraseclear 🔥Operationsfindcountlower_bound和upper_…...
React 18【实用教程】(2024最新版)
搭建开发环境 含配置,react-developer-tools 和 Redux DevTools 下载安装 https://blog.csdn.net/weixin_41192489/article/details/138523829 JSX 语法 https://blog.csdn.net/weixin_41192489/article/details/138649165 组件 父子组件传值、兄弟组件传值、越层组…...
Perl语言入门学习指南
Perl语言(Practical Extraction and Report Language)是一种强大的脚本语言,以其灵活性和强大的文本处理能力而闻名。Perl广泛应用于系统管理、Web开发、网络编程和数据处理等领域。本文将带您入门Perl语言,介绍其基本语法、常用功…...
《Java8函数式编程》学习笔记汇总
前言 见证了java8的多层排序,为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记...
C语言之封装,继承,多态
本文参考: c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中,c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序: struct student {int…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...