第十二篇:linux下socket本地套接字通讯
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。
用途
- 进程间通信:本地套接字允许在同一台主机上的不同进程之间进行数据传输,类似于管道(pipe)和命名管道(FIFO),但提供了更灵活和通用的解决方案。
- 资源共享:通过本地套接字,进程可以共享数据、文件或设备等资源,实现进程间的协同工作。
- 服务间交互:在分布式系统或微服务架构中,本地套接字可以用于服务间的本地通信,提高服务间的交互效率和可靠性。
应用场景
- 数据库服务:数据库服务器和客户端进程通常运行在同一台主机上,通过本地套接字进行通信,实现数据的查询、插入、更新和删除等操作。
- 中间件服务:在分布式系统中,中间件服务(如消息队列、缓存服务等)通常与应用程序运行在同一台主机上,通过本地套接字进行通信,实现数据的传递和处理。
- 调试和测试:在软件开发过程中,开发人员可以使用本地套接字在本地环境中模拟网络通信,进行调试和测试工作,提高开发效率和质量。
- 本地进程监控和管理:系统管理工具可以使用本地套接字监控和管理本地进程,如获取进程状态、终止进程等。
优点
- 高效性:由于本地套接字不涉及网络通信,因此数据传输速度更快,延迟更低。
- 可靠性:本地套接字提供了稳定的进程间通信机制,避免了网络通信中的不确定性和延迟。
- 安全性:由于数据在本地主机上传输,因此安全性更高,不易受到网络攻击和窃听。
本地套接字与普通套接字开发上的主要差异
-
协议族:本地套接字使用
AF_UNIX
,而普通套接字使用AF_INET
(IPv4)或AF_INET6
(IPv6)。 -
地址结构体:本地套接字使用
struct sockaddr_un
,而普通套接字使用struct sockaddr_in
(IPv4)或struct sockaddr_in6
(IPv6)。 -
套接字文件:本地套接字在文件系统中创建一个套接字文件(如
/tmp/unix_socket
),而普通套接字则使用IP地址和端口号进行通信。 -
通信范围:本地套接字仅限于同一台计算机上的进程间通信,而普通套接字可以在网络上的不同计算机之间进行通信。
-
性能:本地套接字由于不经过网络协议栈,通常具有更低的延迟和更高的吞吐量。
-
安全性:本地套接字由于通信双方在同一台计算机上,相对更安全,但也需要注意文件系统的权限设置。普通套接字则可能面临网络攻击的风险,需要采取适当的安全措施。
完整例子如下:不解释了。
service:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>#define SOCKET_PATH "/tmp/unix_socket"
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_un address;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};int opt = 1;int addrlen_size;// 创建套接字if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置套接字选项,允许重用地址和端口if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");close(server_fd);exit(EXIT_FAILURE);}// 清除地址结构memset(&address, 0, sizeof(struct sockaddr_un));// 设置地址和端口address.sun_family = AF_UNIX;strncpy(address.sun_path, SOCKET_PATH, sizeof(address.sun_path) - 1);// 绑定套接字到地址if (bind(server_fd, (struct sockaddr *)&address, sizeof(struct sockaddr_un)) < 0) {perror("bind failed");close(server_fd);exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen");close(server_fd);unlink(SOCKET_PATH); // 删除套接字文件exit(EXIT_FAILURE);}// 接受客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen_size)) < 0) {perror("accept");close(server_fd);unlink(SOCKET_PATH); // 删除套接字文件exit(EXIT_FAILURE);}// 读取客户端发送的数据int valread = read(new_socket, buffer, BUFFER_SIZE);printf("Received: %s\n", buffer);// 发送响应给客户端char *hello = "Hello from server";send(new_socket, hello, strlen(hello), 0);printf("Hello message sent\n");// 关闭套接字close(new_socket);close(server_fd);unlink(SOCKET_PATH); // 删除套接字文件return 0;
}
client:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>#define SOCKET_PATH "/tmp/unix_socket"
#define BUFFER_SIZE 1024int main() {int sock = 0;struct sockaddr_un serv_addr;char buffer[BUFFER_SIZE] = {0};char *hello = "Hello from client";// 创建套接字if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {perror("Socket creation error");return -1;}serv_addr.sun_family = AF_UNIX;strcpy(serv_addr.sun_path, SOCKET_PATH);// 连接服务端if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_un)) < 0) {perror("Connection Failed");return -1;}// 发送数据到服务端send(sock, hello, strlen(hello), 0);printf("Hello message sent\n");// 读取服务端的响应int valread = read(sock, buffer, BUFFER_SIZE);printf("Received: %s\n", buffer);// 关闭套接字close(sock);return 0;
}
其余自己脑补去。
相关文章:

第十二篇:linux下socket本地套接字通讯
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。 用途 进程间通信:本地套…...

Spring Boot 2.1.7 数据源自动加载过程详解
在 Spring Boot 中,数据源的自动配置是框架中一个关键功能,本文将以 Spring Boot 2.1.7 版本为例,详细讲解在单数据源情况下数据源是如何自动加载的。我们通过源码分析,追踪整个加载流程。 1. 自动配置类的发现 Spring Boot 使用…...

【Vue.js 3.0】provide 、inject 函数详解
在 Vue 3 中,provide 和 inject 是用于跨组件层次结构进行依赖注入的一对 API。这些 API 主要用于祖先组件和后代组件之间的数据传递,尤其是当这些组件之间没有直接的父子关系时。 1. 示例 1.1 provide provide 函数用于在祖先组件中定义一个值&#…...

JVM(Java虚拟机)的虚拟机栈
JVM(Java虚拟机)的虚拟机栈是Java程序运行时的重要组件,以下是对其的详细解析: 一、概念与功能 概念:虚拟机栈也称为Java栈,是JVM为每个线程分配的一个私有的内存区域。每个线程在创建时都会创建一个虚拟…...

Elasticsearch02-安装7.x
零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch (1)JDK安装 Elasticsearch是基于java开发的,所以需要安装JDK。我们安装的Elasticsearch版本是7.15,对应JDK至少1.8版本以上。也可以不安装jdk,…...

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片
在计算机时代,我们依靠手机来捕捉和存储珍贵的回忆。但是,如果您不小心删除或丢失了手机上的照片怎么办?这真的很令人沮丧和烦恼,不是吗?好吧,如果您在 iPhone 上丢失了照片,您不必担心…...

vba批量化调整word的图和图表标题
vba代码 将图片进行居中操作 Sub ChangePictureFormate()Dim oPara As ParagraphDim oRange As RangeDim i As LongDim beforeIsPicture As BooleanbeforesIsPicture False 确保文档中至少有图片If ActiveDocument.InlineShapes.Count 0 ThenMsgBox "没有找到图片。&qu…...

【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互
前言 欢迎来到第二篇文章,这也是第二个难题,就是原有的移动端本身一些页面H5的形式去呈现(webview),例如某些需要动态更换内容的页面,某些活动页面、支付页面,不仅仅做页面呈现,还包…...

【C语言的奥秘11】指针知识点总结(续)
目录 一、指针的运算 1、指针与整数相加减 2、指针-指针(地址-地址) 3、指针的关系运算 六、指针和数组 七、二级指针 八、指针数组 一、指针的运算 1、指针与整数相加减 看一下下面的代码: #include<stdio.h> int my_strlen(c…...

excel 列名是数据表 的字段名 ,单元格的值 是数据表对应字段的值,生成sql插入语句
在 Excel 中,按 Alt F11 打开 VBA 编辑器。在菜单栏选择 插入 -> 模块,在新模块中粘贴以下代码。 VBA 代码 Sub GenerateSQLInsertStatementsToFile()Dim ws As WorksheetDim lastRow As Long, lastCol As Long, i As Long, j As LongDim sql As S…...

AI Agent与MEME:技术与文化融合驱动Web3创新
AI Agent如何引领Web3新时代? 随着Web3与区块链技术的迅速发展,AI Agent作为人工智能与区块链的交汇点,正在逐步成为推动去中心化生态的重要力量。同时,MEME文化凭借其强大的社区驱动力和文化渗透力,在链上生态中扮演着…...

IO的入门
目录 1.IO概述1.1流的分类 2.字符流2.1 案例 1.IO概述 IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。 对于java来说输…...

构建一个rust生产应用读书笔记四(实战1)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者? 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。姓名:虽然这不是强制性的,但我们希望收集一个名字…...

SpringCloudAlibaba | Sentinel从基础到进阶
一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件,主要用于解决微服务架构中的高可用性和稳定性问题(雪崩问题)。 常见的使用场景有: 流量控制舱壁模式(线程隔离)超时处理熔断降级 二、流量控…...

算法刷题Day18: BM41 输出二叉树的右视图
题目链接 描述 思路: 递归构造二叉树在Day15有讲到。复习一下,就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点,可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点,每次从队列里…...

【信息系统项目管理师-论文真题】2015下半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

Windows如何安装go环境,离线安装beego
一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件:分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件,然后解压到指定的路径 2、配置环境变量 需要新建两个环境…...

JavaScript网络请求( XMLHttpRequest 对象,进度事件, 跨源资源共享)
一、 XMLHttpRequest 对象 IE5 是第一个引入 XHR 对象的浏览器。这个对象是通过 ActiveX 对象实现并包含在 MSXML 库中 的。为此, XHR 对象的 3 个版本在浏览器中分别被暴露为 MSXML2.XMLHttp 、 MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。 所有现代…...

计算机网络信息系统安全问题及解决策略
目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 (一)计算机网络信息系统研究现状 (二)计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 (一)环境危害引发的安全问…...

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题
解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时,调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误: Model inference er…...

你了解TCP/IP参考模型吗
前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 你了解TCP/IP参考模型吗 一. TCP/IP参考模型二. TCP/IP模型图解三. TCP/IP模型的对比与OSI模型四. TCP/IP协议族五. 总结 TCP/IP参考…...
高斯混合模型及最大期望算法(EM)聚类
混合高斯分布(Gaussian Mixture Model,GMM)是一种概率模型,用于表示具有多个高斯分布的加权组合的数据集。它被广泛应用于模式识别、聚类分析和密度估计等领域。 定义 混合高斯分布由多个单变量或多变量高斯分布的线性组合组成。…...

批处理命令的语法与功能
目录 案例一 echo命令语法及应用 案例二 命令语法及应用 案例三 goto命令语法及应用 案例四 pause命令语法及应用 案例五 call命令语法及应用 案例六 start命令语法及应用 案例七 rem命令语法及应用 案例八 if命令语法及应用 案例九 set命令的语法及应用 案例十 setl…...

33. Three.js案例-创建带阴影的球体与平面
33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…...

Three.js材质纹理扩散过渡
Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…...

免费开源!推荐一款网页版数据库管理工具!
免费开源!推荐一款网页版数据库管理工具! DBGate 是一个开源的数据库管理工具,DBGate 的最大特点是可以 Web 访问!,轻松实现一台机器部署,所有人使用! 无论是 MySQL、PostgreSQL、SQLite 还是…...

生态系统NPP及碳源、碳汇模拟实践技术应用(土地利用变化、未来气候变化、空间动态模拟)
由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…...

Mvc、Springmvc框架
一.Mvc: 1.概念: MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层; 结构图: 二.Springmvc: 1.概念: springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…...

MATLAB2021B APP seriallist 串口通信
文章目录 前言一、项目需要二、使用步骤1.查找串口填写到查找列表2.发送函数3. 接收函数4.检测串口按钮5.选择串口号 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文内容,下面…...

【Python爬虫系列】_033.Scrapy_分布式爬虫
课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…...