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

Unix 域套接字(本地套接字)

Unix 域套接字(Unix Domain Sockets),也称为本地套接字(Local Sockets),是一种用于同一主机上进程间通信(IPC)的机制。Unix 域套接字提供了一种高效的进程间通信方式,它利用文件系统作为传输媒介,而不是网络栈,因此可以避免网络层的开销。下面详细介绍 Unix 域套接字的概念、用途、API 以及示例代码。

概述

Unix 域套接字是一种只在 Unix 和类 Unix 操作系统(包括 Linux)中可用的套接字类型。它允许在同一主机上的进程之间通过文件系统进行通信,而不必通过网络层。Unix 域套接字可以分为两种类型:

  1. 流式套接字 (SOCK_STREAM):提供面向连接的服务,类似于 TCP。
  2. 数据报套接字 (SOCK_DGRAM):提供无连接的服务,类似于 UDP。

特点

  • 高效性:由于通信发生在同一主机上,不需要经过网络层,因此效率更高。
  • 安全性:通信数据不离开本机,减少了外部攻击的风险。
  • 简单性:API 与传统的网络套接字相似,但无需处理 IP 地址和端口。

API

Unix 域套接字主要使用的函数包括:

  • socket():

    • int socket(int domain, int type, int protocol): 创建一个套接字。
    • 参数domain指定域,对于 Unix 域套接字为AF_UNIXtype指定套接字类型,如SOCK_STREAMSOCK_DGRAMprotocol通常设为0。
  • bind():

    • int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen): 绑定套接字到一个地址。
    • 参数sockfd是套接字描述符,addr是地址结构的指针,addrlen是地址结构的大小。
  • listen():

    • int listen(int sockfd, int backlog): 将套接字标记为监听状态。
    • 参数sockfd是套接字描述符,backlog是连接队列的最大长度。
  • accept():

    • int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen): 接受传入的连接。
    • 参数sockfd是监听套接字描述符,addraddrlen用于返回客户端的地址信息。
  • connect():

    • int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen): 连接到一个服务器。
    • 参数sockfd是套接字描述符,addr是服务器地址结构的指针,addrlen是地址结构的大小。
  • send()recv():

    • ssize_t send(int sockfd, const void *buf, size_t len, int flags): 发送数据。
    • ssize_t recv(int sockfd, void *buf, size_t len, int flags): 接收数据。
    • 参数sockfd是套接字描述符,buf是缓冲区指针,len是数据长度,flags用于指定发送或接收的选项。
  • close():

    • int close(int sockfd): 关闭套接字。
    • 参数sockfd是套接字描述符。

示例代码

下面是一个简单的 Unix 域套接字示例,演示了如何在服务器和客户端之间进行通信。

服务器端 (server.c)

1#include <sys/socket.h>
2#include <sys/un.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <string.h>
7
8#define SOCK_PATH "/tmp/unix_socket_example.sock"
9
10int main() {
11    int server_sock, client_sock;
12    struct sockaddr_un addr;
13    char buf[1024];
14
15    // 创建 Unix 域套接字
16    server_sock = socket(AF_UNIX, SOCK_STREAM, 0);
17    if (server_sock == -1) {
18        perror("socket");
19        exit(EXIT_FAILURE);
20    }
21
22    // 清空地址结构
23    memset(&addr, 0, sizeof(addr));
24    addr.sun_family = AF_UNIX;
25    strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1);
26
27    // 绑定套接字
28    if (bind(server_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
29        perror("bind");
30        exit(EXIT_FAILURE);
31    }
32
33    // 监听连接
34    if (listen(server_sock, 5) == -1) {
35        perror("listen");
36        exit(EXIT_FAILURE);
37    }
38
39    // 接受连接
40    socklen_t len = sizeof(addr);
41    client_sock = accept(server_sock, (struct sockaddr *)&addr, &len);
42    if (client_sock == -1) {
43        perror("accept");
44        exit(EXIT_FAILURE);
45    }
46
47    // 接收数据
48    ssize_t bytes_received = recv(client_sock, buf, sizeof(buf), 0);
49    if (bytes_received == -1) {
50        perror("recv");
51        exit(EXIT_FAILURE);
52    }
53    buf[bytes_received] = '\0';
54
55    // 输出收到的数据
56    printf("Received: %s\n", buf);
57
58    // 关闭连接
59    close(client_sock);
60    close(server_sock);
61
62    // 删除套接字文件
63    unlink(SOCK_PATH);
64
65    return 0;
66}

客户端 (client.c)

1#include <sys/socket.h>
2#include <sys/un.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <string.h>
7
8#define SOCK_PATH "/tmp/unix_socket_example.sock"
9
10int main() {
11    int sock;
12    struct sockaddr_un addr;
13    char buf[] = "Hello, Unix Domain Socket!";
14
15    // 创建 Unix 域套接字
16    sock = socket(AF_UNIX, SOCK_STREAM, 0);
17    if (sock == -1) {
18        perror("socket");
19        exit(EXIT_FAILURE);
20    }
21
22    // 清空地址结构
23    memset(&addr, 0, sizeof(addr));
24    addr.sun_family = AF_UNIX;
25    strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1);
26
27    // 连接到服务器
28    if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
29        perror("connect");
30        exit(EXIT_FAILURE);
31    }
32
33    // 发送数据
34    if (send(sock, buf, strlen(buf), 0) == -1) {
35        perror("send");
36        exit(EXIT_FAILURE);
37    }
38
39    // 关闭连接
40    close(sock);
41
42    return 0;
43}

编译和运行

为了编译上述代码,你可以使用以下命令:

1gcc -o server server.c
2gcc -o client client.c

然后运行这两个程序:

1./server &
2./client

注意事项

  • 在使用 Unix 域套接字之前,确保检查所有 API 调用的返回值,以确保操作成功。
  • 在关闭套接字之后,记得删除套接字文件,以避免占用不必要的系统资源。
  • 如果套接字文件不再需要,应使用 unlink() 删除它,以避免占用不必要的系统资源。
  • 在实际应用中,可能需要处理更复杂的错误情况,比如处理连接失败的情况。

Unix 域套接字提供了一种简单而强大的机制来进行进程间的通信,非常适合那些需要快速访问共享数据的应用场景。理解和熟练掌握这些 API 对于开发可靠的多进程应用程序非常重要。

 

相关文章:

Unix 域套接字(本地套接字)

Unix 域套接字&#xff08;Unix Domain Sockets&#xff09;&#xff0c;也称为本地套接字&#xff08;Local Sockets&#xff09;&#xff0c;是一种用于同一主机上进程间通信&#xff08;IPC&#xff09;的机制。Unix 域套接字提供了一种高效的进程间通信方式&#xff0c;它利…...

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例&#xff08;nRF52 系列&#xff0…...

go安装lazydocker

安装 先安装go环境 https://blog.csdn.net/Yqha1/article/details/146430281?fromshareblogdetail&sharetypeblogdetail&sharerId146430281&sharereferPC&sharesourceYqha1&sharefromfrom_link 安装lazydocker go install github.com/jesseduffield/laz…...

LangChain开发(一)介绍和第一个例子

文章目录 简介LangChain框架组成LangChain库&#xff08;Libraries&#xff09;LangChain任务处理流程核心概念1. LLMs2. Chat Models3. 消息&#xff08;Message&#xff09;4. 提示&#xff08;prompts&#xff09;5. 输出解析器&#xff08;Output Parsers&#xff09;6.Ret…...

Chrome-Edge-IDEA-Win 常用插件-工具包

Chrome-Edge-IDEA-Win 常用插件-工具包 Chrome-Edge-IDEA-Win 常用插件-工具包谷歌插件chropathJSONViewOctotree - GitHub code treeXPath Helper书签侧边栏篡改猴Print Edit WEEdge浏览器插件IDEA插件CodeGlance Pro 代码迷你缩放图插件Alibaba Cloud ToolkitAlibaba Java Co…...

电加热产品亚马逊审核标准UL499报告

很多亚马逊卖家都上架应季产品 像加热垫 加热杯垫 加热毯等产品 都少不了亚马逊UL测试的报告 亚马逊明确要求 电子产品在亚马逊销售就必须需要有UL报告 不然就产品就被有下架的风险。由于 UL 标准也就是美洲的安全测试标准&#xff0c;因此亚马逊出于对安全的考虑会加强对带电的…...

从实践到创新:低代码驱动教育行业数字化转型

随着数字化转型浪潮席卷教育领域&#xff0c;低代码开发平台因其“低门槛、高效率、强适配”特性&#xff0c;正成为教育行业信息化改革的新工具。本文将结合低代码技术在教育场景中的典型应用案例&#xff0c;分享其对教学管理、科研创新及人才培养模式的变革价值。 一、政策与…...

@AuthenticationPrincipal user null

AuthenticationPrincipal user: null 当使用 AuthenticationPrincipal 注解时&#xff0c;如果注入的 user 为 null&#xff0c;通常是因为以下原因之一&#xff1a; 1. 用户未登录 原因 当前请求没有经过身份验证&#xff0c;Spring Security 的 SecurityContext 中没有用户…...

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…...

citrix安装部署

在Citrix环境中&#xff0c;特别是在Citrix XenApp或Citrix XenDesktop的部署中&#xff0c;涉及到多个步骤和考虑因素。Citrix是一家提供虚拟化桌面和应用程序解决方案的公司&#xff0c;其产品可以帮助企业实现桌面和应用虚拟化&#xff0c;从而提升灵活性、安全性和管理效率…...

ffmpeg库视频硬编码使用流程

‌一、硬件编码核心流程‌ ‌硬件设备初始化 // 创建CUDA硬件设备上下文‌ AVBufferRef *hw_device_ctx NULL; av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA, NULL, NULL, 0);// 绑定硬件设备到编码器上下文‌ codec_ctx->hw_device_ctx av_buffer_…...

996引擎-接口测试:消息Tips

996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…...

【入门初级篇】布局类组件的使用(1)

【入门初级篇】布局类组件的使用&#xff08;1&#xff09; 视频要点 &#xff08;1&#xff09;章节大纲介绍 &#xff08;2&#xff09;布局类组件类型介绍&#xff1a;行布局、列布局、标题 &#xff08;3&#xff09;实操演示&#xff1a;列表统计查询布局模型 点击访问my…...

JavaWeb之WebSocket

目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本&#xff1a;8.0.442、Maven 依赖&#xff1a;3、前端代码4、后端…...

算法2--两数相加

题目描述 解题思路 题目说的很详细了&#xff0c;也就是把每个数倒序写成链表进行输入&#xff0c;然后让你计算两个倒序数组的和&#xff0c;要保证跟预期的结果一样。 首先应该考虑的是两个数组的长度问题&#xff0c;对于链表的每一位进行加法运算&#xff0c;如果两个列表…...

突破边界:Tauri 2.0全局状态管理的原子级实践

精心打造的Tauri 2.0全局状态管理深度指南&#xff0c;融合最新框架特性与企业级实践方案&#xff1a; 一、Tauri 2.0状态管理新范式 1.1 量子态存储模型 #mermaid-svg-paiGRksb0JRQ3TqJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fil…...

Springboot的jak安装与配置教程

目录 Windows系统 macOS系统 Linux系统 Windows系统 下载JDK&#xff1a; 访问Oracle官网或其他JDK提供商网站&#xff0c;下载适合Windows系统的JDK版本。网站地址&#xff1a;Oracle 甲骨文中国 | 云应用和云平台点击进入下滑&#xff0c;点击进入下载根据自己的系统选择&…...

Axure大屏可视化模板:赋能多领域,开启数据展示新篇章

在当今这个数据爆炸的时代&#xff0c;数据已经成为各行各业的核心资产。然而&#xff0c;如何高效、直观地展示数据&#xff0c;并将其转化为有价值的决策依据&#xff0c;成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板&#xff0c;作为一款强大的数据展示工具&am…...

大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比

交叉熵损失&#xff1a;深度学习中的基石与洞见 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;是现代深度学习中分类任务的核心损失函数&#xff0c;尤其在训练大规模模型&#xff08;如 transformers 等大型语言模型 LLM&#xff09;时&#xff0c;几乎无处不在。对…...

C++|GLog开源库的使用 如何实现自定义类型消息日志

参考&#xff1a; C glog使用教程与代码演示 C第三方日志库Glog的安装与使用超详解 GLOG从入门到入门 glog 设置日志级别_glog C版本代码分析 文章目录 日志等级自定义消息创建使用宏定义 日志等级 在 glog 中&#xff0c;日志的严重性是通过 LogSeverity 来区分的&#xff0c…...

cursor常用快捷键(JetBrains Darcula主题风格)

一、基础操作速查 打开/创建项目 打开项目&#xff1a;Ctrl Shift O&#xff08;选择文件夹&#xff09;新建文件&#xff1a;Ctrl N保存文件&#xff1a;Ctrl S关闭当前标签页&#xff1a;Ctrl F4 代码编辑 复制当前行&#xff1a;Ctrl D删除当前行&#xff1a;Ctrl …...

区块链学习总结

Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境&#xff0c;专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约&#xff0c;并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络&#xff08;Hardhat Ne…...

《深入剖析鸿蒙生态原生应用:一次开发多端部署的技术革新》

在数字化时代飞速发展的浪潮中&#xff0c;鸿蒙生态以其独特的技术理念和强大的创新能力&#xff0c;为开发者和用户带来了全新的体验。其中&#xff0c;“一次开发多端部署”作为鸿蒙生态原生应用开发的核心技术之一&#xff0c;不仅是技术上的重大突破&#xff0c;更是对未来…...

知识蒸馏:让大模型“瘦身“而不失智慧的魔术

引言&#xff1a;当AI模型需要"减肥" 在人工智能领域&#xff0c;一个有趣的悖论正在上演&#xff1a;大模型的参数规模每年以10倍速度增长&#xff0c;而移动设备的算力却始终受限。GPT-4的1750亿参数需要价值500万美元的GPU集群运行&#xff0c;但现实中的智能设备…...

JavaScript 获取 URL 中参数值的详解

JavaScript 获取 URL 中参数值的详解 1. 了解 URL 参数2. 使用 URLSearchParams 获取参数值2.1 什么是 URLSearchParams&#xff1f;2.2 示例代码2.3 优缺点 3. 使用正则表达式获取参数值3.1 示例代码3.2 分析 4. 自定义解析函数4.1 示例代码4.2 分析 5. 小结与注意事项 在开发…...

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…...

ruoyi-vue部署4

1.jdk-linux安装 2.tomcat-linux安装 3.ruoy后台部署 4.nginx-linux安装5.ruoyi前端部署​​​​​​​...

【秣厉科技】LabVIEW工具包——OpenCV 教程(12):机器学习

文章目录 前言机器学习例1&#xff1a;支持向量机&#xff08;SVM&#xff09;做平面向量二分类例2&#xff1a; K邻近算法&#xff08;KNearest&#xff09;实现分类 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Wind…...

分布式事务解决方案简介

一、分布式事务的挑战 在分布式系统中&#xff0c;多个服务协同完成一个业务操作时&#xff0c;可能会遇到数据一致性问题。传统单体应用的ACID事务无法直接扩展到分布式环境&#xff0c;主要矛盾在于&#xff1a; • 网络不可靠&#xff1a;服务间通信可能失败。 • 并发冲突…...

【leetcode hot 100 17】电话号码的字母组合

分析&#xff1a;当设计关键字“所有组合”时&#xff0c;要考虑深度优先遍历、广度优先遍历&#xff08;层次遍历&#xff09;&#xff0c;其中&#xff1a; 深度优先搜索&#xff1a; 自顶向下的递归实现深搜定义子问题在当前递归层结合子问题结果解决原问题 广度优先搜索 利…...