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…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
