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

linux下socket本地套接字通讯

        使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。        

用途

  1. 进程间通信:本地套接字允许在同一台主机上的不同进程之间进行数据传输,类似于管道(pipe)和命名管道(FIFO),但提供了更灵活和通用的解决方案。
  2. 资源共享:通过本地套接字,进程可以共享数据、文件或设备等资源,实现进程间的协同工作。
  3. 服务间交互:在分布式系统或微服务架构中,本地套接字可以用于服务间的本地通信,提高服务间的交互效率和可靠性。

应用场景

  1. 数据库服务:数据库服务器和客户端进程通常运行在同一台主机上,通过本地套接字进行通信,实现数据的查询、插入、更新和删除等操作。
  2. 中间件服务:在分布式系统中,中间件服务(如消息队列、缓存服务等)通常与应用程序运行在同一台主机上,通过本地套接字进行通信,实现数据的传递和处理。
  3. 调试和测试:在软件开发过程中,开发人员可以使用本地套接字在本地环境中模拟网络通信,进行调试和测试工作,提高开发效率和质量。
  4. 本地进程监控和管理:系统管理工具可以使用本地套接字监控和管理本地进程,如获取进程状态、终止进程等。

优点

  1. 高效性:由于本地套接字不涉及网络通信,因此数据传输速度更快,延迟更低。
  2. 可靠性:本地套接字提供了稳定的进程间通信机制,避免了网络通信中的不确定性和延迟。
  3. 安全性:由于数据在本地主机上传输,因此安全性更高,不易受到网络攻击和窃听。

本地套接字与普通套接字开发上的主要差异

  1. 协议族:本地套接字使用AF_UNIX,而普通套接字使用AF_INET(IPv4)或AF_INET6(IPv6)。

  2. 地址结构体:本地套接字使用struct sockaddr_un,而普通套接字使用struct sockaddr_in(IPv4)或struct sockaddr_in6(IPv6)。

  3. 套接字文件:本地套接字在文件系统中创建一个套接字文件(如/tmp/unix_socket),而普通套接字则使用IP地址和端口号进行通信。

  4. 通信范围:本地套接字仅限于同一台计算机上的进程间通信,而普通套接字可以在网络上的不同计算机之间进行通信。

  5. 性能:本地套接字由于不经过网络协议栈,通常具有更低的延迟和更高的吞吐量。

  6. 安全性:本地套接字由于通信双方在同一台计算机上,相对更安全,但也需要注意文件系统的权限设置。普通套接字则可能面临网络攻击的风险,需要采取适当的安全措施。

 

完整例子如下:不解释了。

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本地套接字通讯

使用套接字除了可以实现网络间不同主机间的通信外&#xff0c;还可以实现同一主机的不同进程间的通信&#xff0c;且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口&#xff0c;只是地址结构与某些参数不同。 用途 进程间通信&#xff1a;本地套…...

NDRCContextUnmarshall断点函数分析之I_RpcBindingCopy函数的作用

NDRCContextUnmarshall断点函数分析之I_RpcBindingCopy函数的作用 第一部分&#xff1a; void RPC_ENTRY NDRCContextUnmarshall ( // process returned context OUT NDR_CCONTEXT PAPI *phCContext,// stub context to update IN RPC_BINDING_HANDLE hRPC, …...

WebView2教程(基于C++)【一】环境初始化

创建一个VisualStudio C项目&#xff0c;通过NuGet包管理器安装两个包&#xff1a; 注意&#xff0c;在项目属性页设置项目使用&#xff1a;C 20&#xff0c;子系统设置成窗口&#xff08;相应的预处理器也要改变&#xff09;&#xff0c;DPI识别设置成每个监视器高DPI识别。 …...

go语言中context的用法

0 概述 Context 是 Go 语言中非常重要的一个概念&#xff0c;它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中&#xff0c;Context 提供了更好的控制和管理&#xff0c;尤其是当你需要在多个 goroutine 之间传递状态或进行…...

概括网络给社会生活带来的种种影响

题目 【2002年国考申论】给定资料反映了网络给社会生活带来的种种影响&#xff0c;用不超过200字对这些影响进行概括。 要求&#xff1a;全面&#xff0c;有条理&#xff0c;有层次。(20分) 审题 特定事实&#xff1a;网络给社会生活带来的种种影响基本题型&#xff1a;单一…...

OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数&#xff0c;用于将点从齐次坐标&#xff08;homogeneous coordinates&#xff09;…...

Jmeter如何对UDP协议进行测试?

Jmeter如何对UDP协议进行测试&#xff1f; 1 jmeter-plugins安装2 UDP-Protocol Support安装3 UDP协议测试 1 jmeter-plugins安装 jmeter-plugins是Jmeter的插件管理器&#xff1b;可以组织和管理Jmeter的所有插件&#xff1b;直接进入到如下页面&#xff0c;选择如图的选项进…...

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…...

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.传输层协议 UDP 1.1 传输层 1.2 端口号 1.3 UDP 协议 1.3.1 UDP 协议端格式 1.3.2 UDP 的特点 1.3.3 面向数据报 1…...

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切&#xff0c;并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元&#xff0c;其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展&#xff0c;公共安防关乎每一个市民的生命财产安全。在…...

ORACLE逗号分隔的字符串字段,关联表查询

使用场景如下&#xff1a; oracle12 以前的写法&#xff1a; selectt.pro_ids,wm_concat(t1.name) pro_names from info t,product t1 where instr(,||t.pro_ids|| ,,,|| t1.id|| ,) > 0 group by pro_ids oracle12 以后的写法&#xff1a; selectt.pro_ids,listagg(DIS…...

1.5 多媒体系统简介

目录 多媒体系统声音图形与图像动画和视频 多媒体系统 多媒体可分为感觉媒体、表示媒体、表现媒体、交换媒体。 感觉媒体&#xff1a;直接使人产生感觉的媒体&#xff0c;比如声音、图像、视频。表示媒体&#xff1a;计算机中记录感觉的数据格式。表现媒体&#xff1a;记录感觉…...

数据分析学习Day1-使用matplotlib生成2小时每分钟的气温可视化分析图

注意&#xff1a;需要提前下载matplotlib包 pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple import matplotlib.pyplot as plt import random from matplotlib import font_manager # 数据准备 x list(range(121)) # 使用 list() 转换为列表 y [rando…...

ansible部署nginx:1个简单的playbook脚本

文章目录 hosts--ventoryroles执行命令 使用ansible向3台centos7服务器上安装nginx hosts–ventory [rootstand playhook1]# cat /root/HOSTS # /root/HOSTS [webservers] 192.168.196.111 ansible_ssh_passpassword 192.168.196.112 ansible_ssh_passpassword 192.168.196.1…...

三、汇总统计

1.SUM、COUNT、AVERAGE 注意&#xff1a;count函数是计算区域中包含数字的单元格的个数&#xff0c;以上案例中两个空白单元格和一个中文列标题都是没有计算在内的。 平均函数AVERAGE也是按照17进行求平均值的。所以在使用平均值的函数时候&#xff0c;可以根据实际情况看是…...

opencv实现给图像加上logo图像

要用Python和OpenCV给图片加上logo&#xff0c;可以按照以下步骤实现&#xff1a; 读取logo和image图片。 调整logo的大小以适应image。 将logo放置在image的指定位置。 将logo和image合并。 以下是实现代码&#xff1a; import cv2# 读取logo和image图片 logo cv2.imre…...

亚马逊云科技2024 re:Invent大会亮点:Nova大模型与AI基础设施全面升级

引言 作为云计算领域的年度盛会,亚马逊云科技(AWS)的re:Invent大会一直是业界瞩目的焦点。2024年的大会不负众望,推出了一系列重磅产品和服务,尤其是在人工智能和大模型方面的创新令人印象深刻。本文将为您深入解析此次大会的主要亮点,探讨AWS在AI时代的最新布局及其对行业的潜…...

总结与提升

今天学习了ai&#xff0c;对今天学习的内容进行总结。 本文参考chat gpt-4的训练文献。 模型架构基础 Transformer 架构&#xff1a;ChatGPT 采用了 Transformer 架构&#xff0c;这是一种基于自注意力机制的深度学习模型架构。它能够并行计算文本中的长期依赖关系&#xff…...

入门pytorch-Transformer

前言 虽然Transformer是2017年由Google推出&#xff0c;如果按照读论文只读近两年的思路看&#xff0c;那它无疑是过时的&#xff0c;但可惜的是&#xff0c;目前很多论文的核心依然是Transformer&#xff0c;或者由其进行改进的&#xff0c;故本文使用pytorch来搭建一下Trans…...

泛型编程--

auto自动推导数据类型 函数模板 定义和调用 函数模板具体化 函数模板通用版本之外的一个特殊版本 函数模板 具体化函数 &#xff0c;它们的声明和定义都可以分开写。 声明 定义 函数模板写变量 模板参数缺省 类成员函数作为函数模板 类构造函数是函数模板 函数模板重载 函数模…...

Rails API应用数据一致性终极指南:乐观锁与悲观锁对比详解

Rails API应用数据一致性终极指南&#xff1a;乐观锁与悲观锁对比详解 【免费下载链接】rails-api Rails for API only applications 项目地址: https://gitcode.com/gh_mirrors/ra/rails-api 在现代Web应用开发中&#xff0c;数据一致性是API设计的核心挑战之一。Rails…...

百川2-13B量化模型+OpenClaw:低成本搭建24/7内容摘要服务

百川2-13B量化模型OpenClaw&#xff1a;低成本搭建24/7内容摘要服务 1. 为什么需要本地化内容摘要服务 在信息爆炸的时代&#xff0c;我们每天都会接触到大量网页内容。从行业报告到技术文档&#xff0c;从新闻资讯到研究论文&#xff0c;手动阅读和整理这些内容既耗时又低效…...

千问3.5-9B Python入门实战:从零搭建你的第一个AI应用

千问3.5-9B Python入门实战&#xff1a;从零搭建你的第一个AI应用 1. 为什么选择千问3.5-9B入门AI开发 如果你刚接触Python和AI开发&#xff0c;可能会觉得搭建AI应用是个遥不可及的目标。但实际上&#xff0c;借助星图GPU平台和千问3.5-9B这样的开源大模型&#xff0c;入门A…...

OpenClaw版本升级指南:Qwen3.5-9B兼容性测试方法

OpenClaw版本升级指南&#xff1a;Qwen3.5-9B兼容性测试方法 1. 为什么需要专门的升级测试 上周五凌晨三点&#xff0c;我的OpenClaw自动化脚本突然集体罢工——前一天刚更新的框架版本与Qwen3.5-9B模型产生了微妙的兼容性问题。鼠标指针在屏幕上鬼畜般抖动&#xff0c;却始终…...

Vue3集成AntV G6实战:从零构建拓扑图可视化应用

1. 为什么选择Vue3AntV G6做拓扑图&#xff1f; 拓扑图可视化在系统架构设计、网络拓扑分析、依赖关系展示等场景中非常常见。我之前做过一个微服务治理平台的项目&#xff0c;需要直观展示几十个服务之间的调用关系&#xff0c;试过D3.js、ECharts等方案&#xff0c;最后发现A…...

【NOIP】1999真题解析 luogu-P1014 Cantor 表 | GESP三、四级以上可练习

NOIP 1999 普及组真题&#xff0c;主要考察简单的二维矩阵模拟与通过寻找数学规律进行时间复杂度优化。可以用模拟法暴力求解&#xff0c;也能通过总结对角线的排列规律实现高效求解。GESP三、四级以上可练习。题目难度⭐⭐☆☆☆&#xff0c;洛谷难度等级普及−。 luogu-P101…...

如何检查SEO文件是否设置正确

如何检查SEO文件是否设置正确 在当今互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为网站运营中不可忽视的一环。SEO文件的设置直接影响网站在搜索引擎上的排名和流量。因此&#xff0c;如何检查SEO文件是否设置正确&#xff0c;是每一个网站运营者必…...

OpenClaw极简部署方案:Qwen3-14b_int4_awq最小化依赖安装

OpenClaw极简部署方案&#xff1a;Qwen3-14b_int4_awq最小化依赖安装 1. 为什么需要极简部署 上周我在本地尝试部署OpenClaw时&#xff0c;被默认安装的庞大依赖项震惊了——光是Python包就装了近200MB&#xff0c;还自动启用了十几个我根本用不到的技能模块。这种"全家…...

OpenClaw多任务管道:Phi-3-mini-128k-instruct串联处理复杂工作流

OpenClaw多任务管道&#xff1a;Phi-3-mini-128k-instruct串联处理复杂工作流 1. 为什么需要多任务管道&#xff1f; 上个月我需要处理一批英文技术文档的本地化工作&#xff0c;包含三个关键步骤&#xff1a;文档翻译、格式转换和邮件发送。最初我尝试手动操作——先用翻译工…...

好消息!内存条开始降价了,价格能否回到2025年年初价?

今天又开始因为各种原因在电脑上折腾大模型了&#xff0c;但是发现一件很可怕的事情&#xff1a;16GB的内存真的不够用。 哈哈哈哈……这个Windows电脑因为有很长一段时间没有使用&#xff0c;所以在粉丝需要的时候&#xff0c;直接把一对16GB的内存条拆出来卖了&#xff0c;后…...