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…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
