Unix 域协议汇总整理

Unix 域协议是一种用于同一台计算机上进程间通信(IPC)的技术。它提供了一种比基于网络的套接字更高效的方式来在本地进程中交换数据。Unix 域协议使用文件系统作为通信的媒介,并且只限于在同一台计算机上运行的进程之间进行通信。

da7e770630a54b20a731a0575338adfa.jpeg

Unix 域套接字类型

Unix 域套接字支持两种主要类型:

  1. 流套接字 (SOCK_STREAM):类似于 TCP 套接字,提供面向连接的服务,保证数据按顺序传输,并且不会丢失或重复。
  2. 数据报套接字 (SOCK_DGRAM):类似于 UDP 套接字,不保证数据按顺序传输,也不提供错误恢复机制。

Unix 域套接字的优点

  • 高效:由于数据不需要离开本机,所以 Unix 域套接字比网络套接字更快。
  • 安全:通信仅限于本地,减少了网络攻击的风险。
  • 简单:使用与网络套接字相同的 API。

Unix 域套接字的缺点

  • 局限性:只能在同一台计算机上使用。
  • 可移植性:仅限于 Unix 和类 Unix 系统,不适用于 Windows 等其他操作系统。

Unix 域套接字的使用

Unix 域套接字的使用与网络套接字相似,但有一些关键的不同之处:

创建 Unix 域套接字

1#include <sys/un.h>
2#include <sys/socket.h>
3
4// 创建 Unix 域套接字
5int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
6if (sockfd == -1) {
7    perror("socket");
8    exit(EXIT_FAILURE);
9}

地址结构

Unix 域套接字使用 struct sockaddr_un 来表示地址:

1struct sockaddr_un addr;
2memset(&addr, 0, sizeof(addr));
3addr.sun_family = AF_UNIX;
4strncpy(addr.sun_path, "/path/to/socket", sizeof(addr.sun_path) - 1);

绑定套接字

1// 绑定套接字
2if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
3    perror("bind");
4    exit(EXIT_FAILURE);
5}

监听连接

1// 监听连接
2if (listen(sockfd, 5) == -1) {
3    perror("listen");
4    exit(EXIT_FAILURE);
5}

接受连接

1// 接受连接
2int client_sock = accept(sockfd, NULL, NULL);
3if (client_sock == -1) {
4    perror("accept");
5    exit(EXIT_FAILURE);
6}

发送和接收数据

1// 发送数据
2const char *message = "Hello, World!";
3if (send(client_sock, message, strlen(message), 0) == -1) {
4    perror("send");
5    exit(EXIT_FAILURE);
6}
7
8// 接收数据
9char buffer[1024];
10ssize_t bytes_received = recv(client_sock, buffer, 1024, 0);
11if (bytes_received == -1) {
12    perror("recv");
13    exit(EXIT_FAILURE);
14}
15buffer[bytes_received] = '\0';
16printf("Received: %s\n", buffer);

关闭套接字

1// 关闭套接字
2close(sockfd);

示例代码

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

服务器端 (server.c)

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

客户端 (client.c)

1#include <sys/un.h>
2#include <sys/socket.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <string.h>
7
8#define SOCKET_PATH "/tmp/unix_socket"
9
10int main() {
11    int sockfd;
12    struct sockaddr_un addr;
13    char buffer[1024];
14
15    // 创建 Unix 域套接字
16    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
17    if (sockfd == -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, SOCKET_PATH, sizeof(addr.sun_path) - 1);
26
27    // 连接到服务器
28    if (connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
29        perror("connect");
30        exit(EXIT_FAILURE);
31    }
32
33    // 发送数据
34    const char *message = "Hello, Server!";
35    if (send(sockfd, message, strlen(message), 0) == -1) {
36        perror("send");
37        exit(EXIT_FAILURE);
38    }
39
40    // 读取响应
41    ssize_t bytes_received = recv(sockfd, buffer, 1024, 0);
42    if (bytes_received == -1) {
43        perror("recv");
44        exit(EXIT_FAILURE);
45    }
46    buffer[bytes_received] = '\0';
47    printf("Received: %s\n", buffer);
48
49    // 关闭套接字
50    close(sockfd);
51
52    return 0;
53}

编译和运行

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

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

然后先运行服务器:

1./server

接着运行客户端:

1./client

您应该能够在服务器和客户端之间看到数据的交换。

注意事项

  • 在创建 Unix 域套接字之前,请确保不存在旧的套接字文件。如果存在,可以手动删除或在程序开始时删除。
  • 请确保 Unix 域套接字文件具有适当的文件权限,以防止未经授权的访问。
  • 在实际应用中,可能需要处理更复杂的错误情况,比如处理连接失败的情况。
  • 使用 Unix 域套接字时,需要确保文件描述符集合在调用期间不会被其他线程或信号处理程序修改。

Unix 域套接字是一种非常高效和安全的进程间通信方式,非常适合在同一台计算机上运行的进程之间的通信。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM学习:CMS和G1收集器浅析

总框架 一、Java自动内存管理基础 1、运行时数据区 运行时数据区可分为线程隔离和线程共享两个维度&#xff0c;垃圾回收主要是针对堆内存进行回收 &#xff08;1&#xff09;线程隔离 程序计数器 虚拟机多线程是通过线程轮流切换、分配处理器执行时间来实现的。为了线程切换…

1.C语言教程:历史、特点、版本与入门示例

目录 1.历史2.特点3.版本4.编译5.Hello World 示例 1.历史 本篇原文为&#xff1a;C语言教程&#xff1a;历史、特点、版本与入门示例。 更多C进阶、rust、python、逆向等等教程&#xff0c;可去此站查看&#xff1a;酷程网 C 语言的诞生源于 Unix 系统的开发需求。 1969 年…

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

spring防止重复点击,两种注解实现(AOP)

第一种&#xff1a;EasyLock 简介 为了简化可复用注解&#xff0c;自己实现的注解&#xff0c;代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …

Linux-Ubuntu之I2C通信

Linux-Ubuntu之I2C通信 一&#xff0c;I2C通信原理1.写时序2.读时序 二&#xff0c;代码实现三&#xff0c;显示 一&#xff0c;I2C通信原理 使用I2C接口驱动AP3216C传感器&#xff0c;该传感器能实现两个效果&#xff0c;一个是感应光强&#xff0c;另一个是探测物体与传感器…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

框架模块说明 #09 日志模块_01

背景 日志模块是系统的重要组成部分&#xff0c;主要负责记录系统运行状态和定位错误问题的功能。通常&#xff0c;日志分为系统日志、操作日志和安全日志三类。虽然分布式数据平台是当前微服务架构中的重要部分&#xff0c;但本文的重点并不在此&#xff0c;而是聚焦于自定义…

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本&#xff0c;所以有些配置&#xff0c;是可以不用做的&#xff0c;下面仅记录新增操作&#…

算法题(25):只出现一次的数字(三)

审题&#xff1a; 该题中有两个元素只出现一次并且其他元素都出现两次&#xff0c;需要返回这两个只出现一次的数&#xff0c;并且不要求返回顺序 思路: 由于对空间复杂度有要求&#xff0c;我们这里不考虑哈希表。我们采用位运算的方法解题 方法&#xff1a;位运算 首先&#…

将机器学习预测模型融入AI agent的尝试(一)

将机器学习临床预测模型融入AI agent的尝试&#xff08;一&#xff09; 我主要是使用机器学习制作临床预测模型和相关的应用&#xff0c;最近考虑的事情是自己之前的的工作能不能和AI agent进行融合&#xff0c;将AI 对自然语言理解能力和预测模型的预测能力结合在一起&#x…

51单片机——按键实验

由于机械点的弹性作用&#xff0c;按键开关在闭合时不会马上稳定的接通&#xff0c;在断开时也不会一下子断开&#xff0c;因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的&#xff0c;一般为 5ms 到 10ms&#xff0c;为了确保 CPU 对按键的…

电子邮件对网络安全的需求

&#xff08; 1&#xff09;机密性&#xff1a;传输过程中不被第三方阅读到邮件内容&#xff0c;只有真正的接收方才可以阅读邮件。&#xff08; 1.5 分&#xff09; &#xff08; 2&#xff09;完整性&#xff1a;支持在邮件传输过程中不被篡改&#xff0c;若发生篡改&#…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

电子应用设计方案86:智能 AI背景墙系统设计

智能 AI 背景墙系统设计 一、引言 智能 AI 背景墙系统旨在为用户创造一个动态、个性化且具有交互性的空间装饰体验&#xff0c;通过融合先进的技术和创意设计&#xff0c;提升室内环境的美观度和功能性。 二、系统概述 1. 系统目标 - 提供多种主题和风格的背景墙显示效果&…

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …

西安电子科技大学初/复试笔试、面试、机试成绩占比

西安电子科技大学初/复试笔试、面试、机试成绩占比 01通信工程学院 02电子工程学院 03计算机科学与技术学院 04机电工程学院 06经济与管理学院 07数学与统计学院 08人文学院 09外国语学院 12生命科学与技术学院 13空间科学与技术学院 14先进材料与纳米科技学院 15网络与信息安…

多模态论文笔记——CogVLM和CogVLM2(副)

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型的LoRA版本——CogVLM和CogVLM2。在SD 3中使用其作为captioner基准模型的原因和优势。 文章目录 CogVLM论文背景VLMs 的任务与挑战现有方法及…

智慧工地信息管理与智能预警平台

建设背景与政策导向 智慧工地信息管理与智能预警平台的出现&#xff0c;源于工地管理面临的诸多挑战&#xff0c;如施工地点分散、危险区域多、监控手段落后等。随着政府对建筑产业现代化的积极推动&#xff0c;各地纷纷出台政策支持智慧工地的发展&#xff0c;旨在通过信息技…

【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写

文章目录 一、随机数1、Random.Next()生成随机整数示例&#xff1a;生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例&#xff1a;生成随机浮点数 3、 生成随机字母或字符示例&#xff1a;生成随机字母示例&#xff1a;生成随机小写字母 二、…

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…