当前位置: 首页 > news >正文

13.2 Linux_网络编程_UNIX域套接字

概述 

什么是UNIX域套接字:

UNIX域套接字是使用套接字进行本地通信,TCP/UDP是使用套接字进行网络通信。UNIX域套接字也有域流式套接字和域数据报套接字,这两种形式域TCP/UDP的含义类似,使用步骤也完全一致。

bind时绑定的结构体类型:

struct sockaddr_un {sa_family_t sun_family;   //协议类型char sun_path[104];       //套接字文件路径
};

域流式套接字

域流式套接字的创建步骤与TCP创建步骤一致。

server.c代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <signal.h>
#include <sys/wait.h>#define UNIX_PATH "./UNIX"
void Set_SIGCHLD(void);
void SIGCHLD_Handler(int sig);
int main(int argc ,char** argv){int fd;struct sockaddr_un addr;//判断参数有效性if(argc != 2){printf("param err\n");printf("%s<unix path>\n",argv[0]);return -1;}printf("unix path = %s\n",argv[1]);//1.创建socketif((fd=socket(AF_UNIX,SOCK_STREAM,0))<0){//流式UNIXperror("socket");return -1;}//2.绑定addr.sun_family = AF_UNIX;    				  			//UNIXstrncpy(addr.sun_path,argv[1],sizeof(addr.sun_path)); 	//UNIX文件路径if(bind(fd,(struct sockaddr*)&addr,sizeof(struct sockaddr_un)) == -1){perror("bind");return -1;}//3.监听socketif(listen(fd,5) == -1){ 	//允许最多接入5个客户端perror("listen");return -1;}//多进程并发pid_t pid;int newFd;struct sockaddr_un newAddr;socklen_t newAddrlen;Set_SIGCHLD();//以信号方式回收子进程while(1){//4.接受客户端链接if((newFd = accept(fd,(struct sockaddr*)&newAddr,&newAddrlen)) < 0){perror("accept");return -1;}//父进程处理接收客户端链接的问题//子进程处理与客户端交互的问题if((pid=fork()) == -1){perror("fork");return -1;}else if(pid == 0){char buf[100] = {0};close(fd);//对于子进程,socket返回的fd没有用//5.数据交互while(1){memset(buf,0,sizeof(buf));write(newFd,"server",strlen("server\n"));read(newFd,buf,sizeof(buf)-1);printf("read:%s\n",buf);sleep(1);}exit(0);}else{close(newFd);//对于父进程,accept返回的newFd没有用}}remove(argv[1]);close(fd);return 0;
}
void Set_SIGCHLD(void){struct sigaction act;act.sa_handler = SIGCHLD_Handler;sigemptyset(&act.sa_mask);act.sa_flags = SA_RESTART;//让因为信号而终止的系统调用继续运行if(sigaction(SIGCHLD,&act,NULL) != 0){perror("sigaction");}
}
void SIGCHLD_Handler(int sig){int wstatus;waitpid(-1,&wstatus,WNOHANG);if(WIFEXITED(wstatus)){      //判断子进程是否正常退出printf("子进程的返回值为%d\n",WEXITSTATUS(wstatus));}else{printf("子进程是否被信号结束%d\n",WIFSIGNALED(wstatus));printf("结束子进程的信号类型%d\n",WTERMSIG(wstatus));}
}

client.c代码 :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>int main(int argc,char** argv){int fd;struct sockaddr_un addr;//判断参数有效性if(argc != 2){printf("param err\n");printf("%s<unix path>\n",argv[0]);return -1;}printf("unix path = %s\n",argv[1]);//1.创建socketif((fd=socket(AF_UNIX,SOCK_STREAM,0))<0){//流式UNIXperror("socket");return -1;}//2.链接服务器addr.sun_family = AF_UNIX;    				  			//UNIXstrncpy(addr.sun_path,argv[1],sizeof(addr.sun_path)); 	//UNIX文件路径if(connect(fd,(struct sockaddr*)&addr,sizeof(struct sockaddr_un)) == -1){perror("connect");return -1;}//3.数据交互char buf[100] = {0};while(1){if(read(fd,buf,sizeof(buf)-1) > 0){printf("read:%s\n",buf);write(fd,"client:i read it\n",strlen("client:i read it\n"));}}close(fd);return 0;
}

域数据报套接字

server.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>int main(int argc,char** argv){int fd;struct sockaddr_un addr;//判断参数有效性if(argc != 2){printf("param err\n");printf("%s<unix path>\n",argv[0]);return -1;}printf("unix path = %s\n",argv[1]);//1.创建socketif((fd=socket(AF_UNIX,SOCK_DGRAM,0))<0){//数据报UNIXperror("socket");return -1;}//2.绑定IP、端口号addr.sun_family = AF_UNIX;    				  			//UNIXstrncpy(addr.sun_path,argv[1],sizeof(addr.sun_path)); 	//UNIX文件路径if(bind(fd,(struct sockaddr*)&addr,sizeof(struct sockaddr_un)) == -1){perror("bind");return -1;}//3.数据交互char buf[100] = {0};struct sockaddr_un src_addr;socklen_t src_addrlen;while(1){memset(buf,0,sizeof(buf));if(recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&src_addr,&src_addrlen) > 0){printf("read:%s\n",buf);}	}close(fd);return 0;
}

client.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>int main(int argc,char** argv){int fd;struct sockaddr_un addr;//判断参数有效性if(argc != 2){printf("param err\n");printf("%s<unix path>\n",argv[0]);return -1;}printf("unix path = %s\n",argv[1]);//1.创建socketif((fd=socket(AF_UNIX,SOCK_DGRAM,0))<0){//数据报UNIXperror("socket");return -1;}//2.设置要发送到的服务器信息addr.sun_family = AF_UNIX;    				  			//UNIXstrncpy(addr.sun_path,argv[1],sizeof(addr.sun_path)); 	//UNIX文件路径//3.数据交互while(1){sendto(fd,"cilent",strlen("cilent"),0,(struct sockaddr*)&addr,sizeof(addr));sleep(1);}close(fd);return 0;
}

相关文章:

13.2 Linux_网络编程_UNIX域套接字

概述 什么是UNIX域套接字&#xff1a; UNIX域套接字是使用套接字进行本地通信&#xff0c;TCP/UDP是使用套接字进行网络通信。UNIX域套接字也有域流式套接字和域数据报套接字&#xff0c;这两种形式域TCP/UDP的含义类似&#xff0c;使用步骤也完全一致。 bind时绑定的结构体…...

10.22 多进程间通信-共享内存、信号量集

练习&#xff1a;通过信号量集完成对共享内存的同步操作 案例代码&#xff1a; 分文件编译&#xff1a;信号量集部分 sem.h #ifndef __SEM_H__ #define __SEM_H__ #include <myhead.h> union semun {int val; /* Value for SETVAL */struct semid_ds…...

输入输出管理器的使用

解释 InputMgr 是一个输入管理器&#xff0c;主要用于检测并管理用户的输入事件&#xff08;例如键盘和鼠标输入&#xff09;。它通过监听输入事件&#xff0c;并利用事件中心 (EventCenter) 来触发相应的事件。在这里&#xff0c;你可以管理多种输入类型&#xff0c;如按下、…...

windows连接linux服务器上的jupyter lab

文章目录 服务器上开启jupyter lab本地cmd将端口8888映射到服务器的8889上本地浏览器打开8888端口 服务器上开启jupyter lab jupyter-lab --ip 0.0.0.0 --port 8889 --no-browser --allow-root本地cmd将端口8888映射到服务器的8889上 ssh -N -f -L localhost:8888:localhost:…...

golang生成并分析cpu prof文件

1. 定义一个接口&#xff0c;请求接口时&#xff0c;生成cpu.prof文件 在主协程中新启一个协程&#xff0c;当请求接口时&#xff0c;生成一个60秒的cpu.prof文件 go func() {http.HandleFunc("/prof", startProfileHandler)http.ListenAndServe(":9092"…...

【Python爬虫实战】XPath与lxml实现高效XML/HTML数据解析

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、为什么学习xpath和lxml &#xff08;一&#xff09;高效解析和提取数据 …...

软件测试学习笔记丨Selenium学习笔记:元素定位与操作

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22510 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…...

在 HTML 中,<input> 元素支持的事件汇总

在 HTML 中&#xff0c;<input> 元素支持多种事件&#xff0c;这些事件可以在用户与输入字段交互时触发。以下是一些常见的 <input> 事件&#xff1a; input: 当 <input> 元素的值发生变化时触发。适用于文本、数字、日期等类型的输入。 change: 当 <inp…...

vue3【实战】 渲染 md 文件(markdown语法 .md后缀的文件)

1. 安装相关插件 npm i unplugin-vue-markdown markdown-it-prism prism unhead/vue2. 添加配置 src/main.ts // 给 md 文件创建头部 import { createHead } from unhead/vue // md 文件中代码高亮的样式 import prismjs/themes/prism.css // 自定义 md 文件的样式 import /as…...

Sora高端制造业WordPress外贸主题

Sora是一款专为高端制造业设计的WordPress主题&#xff0c;由国内知名wordpress开发团队简站wordpress主题开发&#xff0c;它以红色为主色调&#xff0c;适合外贸企业出海建独立站的模板。这个主题适用于WordPress 6.0及以上版本&#xff0c;并且只服务于真正有需要的用户。主…...

windows安装superset及各种问题解决

1,背景 先说说背景,之前在2月份已经安装过superset3.1.1,当时还没有提示SECRET_KEY异常,能正常运行,且已配置数据库连接. 2,报错信息及解决途径 1,创建admin时,提示Error! User already exists 这个是因为之前已经创建过admin用户,需要删除C:\Users\用户名\.superset下的.…...

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具&#xff0c;实际是串行的&#xff0c;如果需要测试后台接口并发时程序的准确性&#xff0c;建议采用JMeter工具。 案例&#xff1a;JMeter设置20个并发卖票请求&#xff0c;查看后台是否存在超卖的情况 方式一&#xff1a;一共10张票&…...

【小趴菜前端实习日记5】

实习日记5 一、vue3中如何使用router&#xff08;获取this)二、ts中用object定义类型太宽泛导致Ts无法推断出正确类型三、动态设置日记封面失败vite动态引入静态资源1.方法一vue3父子组件生命周期执行顺序 2.方法二3.方法三 四、打包问题总结1.The import.meta meta-property i…...

如何通过谷歌外推占据搜索引擎首页?

外贸企业在推广过程中&#xff0c;如何在谷歌搜索引擎中占据有利位置&#xff0c;获取更多曝光&#xff0c;GLB谷歌霸屏服务就可以派上用场。它通过高效的品牌外推策略&#xff0c;可以让你的企业信息在谷歌中实现“霸屏”效果&#xff0c;特别是长尾关键词的全面覆盖 很多企业…...

jmeter学习(6)逻辑控制器

1. 简单控制器 简单控制器用来存放组件的&#xff0c;没有提供什么逻辑功能。 2. 循环控制器 用来循环执行请求&#xff0c;可以配置循环次数。注意它与线程组、测试计划中的循环是相互独立的&#xff0c;比如在线程组中设置循环2次&#xff0c;循环控制器设置循环3次&#…...

Android14 和android12 在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时

参考如下修改&#xff1a;Android9.0在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时_android 锁屏密码输错5次-CSDN博客 android 14 修改如下&#xff1a; androidap/SYSTEM/frameworks/base$ git status Refresh index: 100% (47218/47218), done. HEAD d…...

智能时代摩托车一键启动无钥匙进入感受科技前线

向智能化与高性能迈进,技术创新与绿色转型引领摩托车行业智能化出行。 摩托车一键启动无钥匙进入功能是一种先进的车辆控制系统&#xff0c;它允许驾驶员在不使用传统机械钥匙的情况下&#xff0c;通过智能感应技术自动解锁和启动摩托车。这种系统通常包括一个智能钥匙&#x…...

需要补充的技能

密码管理 文件管理 人际管理 Microsoft365 teams和onedrive,outlook,sharepoint等 被问到自己不懂的问题的时候怎么迅速反应快速回答&#xff1f; 被帅锅的时候怎么解决&#xff1f; 谈判技巧&#xff1f; 说话的语速&#xff1f; 遇到解决不了的问题如何处理&#xff1f; 考…...

15分钟学 Go 第 15 天:映射(Map)

第15天&#xff1a;映射&#xff08;Map&#xff09; 学习目标 在本节中&#xff0c;我们将深入理解Go语言中的字典类型&#xff08;映射&#xff09;&#xff0c;通过例子与图示来帮助你掌握其使用方法。我们将涵盖以下几个方面&#xff1a; 概念定义创建和使用映射访问和更…...

element-plus 官方表格排序问题

element-plus 官方API 默认表格排序存在问题&#xff0c;一个list 被多组排序 修改后&#xff1a; 注意点&#xff1a; 这里一定要使用 sortable"custom"&#xff0c;自定义 sort-change 方法 使用 sortable true 的情况排序会冲突&#xff0c;出现莫名奇妙的问题…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...

【threejs】每天一个小案例讲解:创建基本的3D场景

代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone&#xff0c;无需安装依赖&#xff0c;直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景&#xff08;Scene&#xff09; 使用 THREE.Scene(…...