UNIX域套接字(Unix Domain Sockets, UDS) 的两种接口

news2025/4/16 5:51:23

目录

    • 1. 流式套接字(SOCK_STREAM)
      • 特点
      • 类比
      • 典型使用场景
      • 代码示例(伪代码)
    • 2. 数据报套接字(SOCK_DGRAM)
      • 特点
      • 类比
      • 典型使用场景
      • 代码示例(伪代码)
    • 3. 两者的核心区别对比
    • 4. 为什么 UNIX 域套接字的数据报是“不可靠”的?
    • 5. 如何选择?
    • 6. 补充:文件描述符传递(仅流式套接字支持)
    • 总结

1. 流式套接字(SOCK_STREAM)

特点

  • 面向连接:在通信前需要建立一个“连接”,类似于打电话前需要拨通电话。
  • 可靠传输:数据不会丢失、重复或乱序,内核会确保数据按顺序到达。
  • 字节流(Byte Stream):数据以连续的字节流形式传输,没有消息边界。例如,发送方发送的3条消息可能被接收方一次性读取为一个长字节流,需要应用程序自行解析分隔。
  • 全双工:支持双向通信,双方可以同时发送和接收数据。

类比

  • 类似 TCP 协议:因为 TCP 也是面向连接、可靠、字节流的。
  • 比如:两个人通过电话聊天,通话过程中不会丢失任何一句话,且按顺序接收。

典型使用场景

  • 数据库通信:例如 MySQL 使用 UDS 流式套接字与客户端通信,确保 SQL 查询和结果的可靠性。
  • 进程间长连接服务:如 Web 服务器与后端服务的稳定通信。

代码示例(伪代码)

// 创建流式套接字(SOCK_STREAM)
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

// 服务器端需要绑定地址并监听
bind(sockfd, &address, sizeof(address));
listen(sockfd, 5);
int client_sock = accept(sockfd, ...);  // 建立连接后获得客户端套接字

// 客户端需要主动连接
connect(sockfd, &server_address, sizeof(server_address));
send(client_sock, "Hello", 5, 0);      // 发送数据流

2. 数据报套接字(SOCK_DGRAM)

特点

  • 无连接:不需要预先建立连接,直接发送数据,类似于寄信。
  • 不可靠传输:数据可能丢失、重复或乱序,内核不保证送达。
  • 消息边界(Message-Oriented):每条消息是独立的,接收方能识别每条消息的边界。例如,发送3条消息,接收方会收到3次独立的数据包。
  • 全双工:同样支持双向通信,但每次通信是独立的消息。

类比

  • 类似 UDP 协议:因为 UDP 也是无连接、不可靠、基于消息的。
  • 比如:寄三封信给朋友,可能其中一封信丢失,或者收到顺序被打乱。

典型使用场景

  • 日志记录系统:可以容忍少量日志丢失,但需要快速发送。
  • 实时性要求高的场景:例如游戏服务器的简单状态更新,避免因重传延迟。

代码示例(伪代码)

// 创建数据报套接字(SOCK_DGRAM)
int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);

// 服务器端绑定地址即可,无需监听和 accept
bind(sockfd, &server_address, sizeof(server_address));

// 客户端无需 connect,可以直接发送(但通常先 bind 自己的地址)
sendto(sockfd, "Hello", 5, 0, &server_address, sizeof(server_address));

// 接收数据时需要指定接收缓冲区和地址
recvfrom(sockfd, buffer, 1024, 0, &client_address, &addr_len);

3. 两者的核心区别对比

特性流式套接字(SOCK_STREAM)数据报套接字(SOCK_DGRAM)
连接方式面向连接(需先建立连接)无连接(直接发送数据)
可靠性可靠(数据不丢失、不重复、不乱序)不可靠(可能丢失、重复、乱序)
数据传输形式字节流(无消息边界)消息(有消息边界,每条独立)
速度略慢(需维护连接状态)更快(无需维护连接)
是否需要 bind服务端必须 bind,客户端可选客户端和服务器都需要 bind 地址
典型协议类比TCPUDP

4. 为什么 UNIX 域套接字的数据报是“不可靠”的?

虽然 UNIX 域套接字在本地通信,但 数据报模式(SOCK_DGRAM)仍然是不可靠的。原因如下:

  • 设计一致性:为了与 UDP 的行为保持一致,方便跨网络和本地套接字的代码迁移。
  • 内核实现:虽然本地传输的可靠性很高,但内核不会主动保证数据报的送达,例如:
    • 如果接收方未准备好(如未调用 recv),可能会丢弃数据。
    • 内存不足时可能导致数据丢失。

5. 如何选择?

  • 选流式套接字(SOCK_STREAM)如果:

    • 需要可靠传输(如金融交易、数据库操作)。
    • 需要保持数据顺序。
    • 需要长连接,减少重复建立连接的开销。
  • 选数据报套接字(SOCK_DGRAM)如果:

    • 速度比可靠性更重要(如实时游戏、日志传输)。
    • 每条消息是独立的,可以容忍少量丢失。
    • 需要无连接的简单通信(如偶尔发送指令)。

6. 补充:文件描述符传递(仅流式套接字支持)

UNIX 域套接字的流式套接字支持 传递文件描述符(File Descriptor Passing),这是其独特优势。例如:

  • 一个进程可以将打开的文件描述符(如文件句柄、网络套接字)传递给另一个进程,接收方可以直接使用该描述符操作资源。
  • 这种功能在进程间共享资源时非常高效,例如 Web 服务器将客户端连接传递给 worker 进程。

总结

  • 流式套接字(SOCK_STREAM):像一条稳定的管道,保证数据可靠、有序地流动,适合需要稳定通信的场景。
  • 数据报套接字(SOCK_DGRAM):像快递服务,快速发送独立包裹,但可能丢失或乱序,适合对速度要求高的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用U盘安装 ubuntu 系统

1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载,本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘,不能选错了;点…

oracle 并行度(Parallel Degree)

在Oracle数据库中,并行度(Parallel Degree) 是用于控制并行处理任务的关键配置,旨在通过多进程协作加速大规模数据处 一、并行度的核心概念 并行度(DOP, Degree of Parallelism) 表示一个操作同时使用的并…

Redis-场景缓存+秒杀+管道+消息队列

缓存一致性 1.两次更新 先更新数据库,再更新缓存;先更新缓存,再更新数据库; 出现不一致问题场景: 先更新数据库,再更新缓存; 先更新缓存,再更新数据库; 两次更新的适…

系统的安全及应用

仓库做了哪些优化 仓库源换成国内源不使用root用户登录将不必要的开机启动项关闭内核的调优 系统做了哪些安全加固 禁止使用root禁止使用弱命令将常见的 远程连接端口换掉 系统安全及应用 Cpu负载高 java程序 运行异常中病毒? ps aux - - sort %cpu %mem Cpu …

PostgreSQL内幕探索—基础知识

PostgreSQL内幕探索—基础知识 PostgreSQL(以下简称PG) 起源于 1986 年加州大学伯克利分校的 ‌POSTGRES 项目‌,最初以对象关系模型为核心,支持高级数据类型和复杂查询功能‌。 1996 年更名为 PostgreSQL 并开源,逐…

WPS复制粘贴错误 ,文件未找到 mathpage.wll

文章目录 1.错误提示图片2.解决方案1.找到MathType.wll文件和MathType Commands 2016.dotm文件并复制2.找到wps安装地址并拷贝上述两个文件到指定目录 3.重启WPS 1.错误提示图片 2.解决方案 1.找到MathType.wll文件和MathType Commands 2016.dotm文件并复制 MathType.wll地址如…

驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比

🔍 B站相应的视屏教程: 📌 内核:博文视频 - 从静态绑定驱动模型到现代设备模型 主题:深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中,我们从驱动框架的历史演进出…

【UE5 C++课程系列笔记】35——HTTP基础——HTTP客户端异步请求API接口并解析响应的JSON

目录 前言 步骤 一、 搭建异步蓝图节点框架 二、异步蓝图节点嵌入到引擎的执行流程 三、获取本地时间并异步返回 四、获取网络时间并异步返回 五、源码 前言 本文以请求网络/本地时间API为例,介绍如何实现HTTP异步请求。 步骤 一、 搭建异步蓝图节点框架 …

手机静态ip地址怎么获取?方法与解析‌

而在某些特定情境下,我们可能需要为手机设置一个静态IP地址。本文将详细介绍手机静态IP地址详解及获取方法 一、什么是静态IP地址? 静态IP:由用户手动设置的固定IP地址,不会因网络重启或设备重连而改变。 动态IP:由路…

Python 基础语法汇总

Python 语法 │ ├── 基本结构 │ ├── 语句(Statements) │ │ ├── 表达式语句(如赋值、算术运算) │ │ ├── 控制流语句(if, for, while) │ │ ├── 定义语句(def…

Linux上位机开发实践(OpenCV算法硬件加速)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 图像处理里面,opencv基本是一个标准模块。但是由于图像处理的特点,如果所有的算法都是cpu来做的话,效率会很低。…

Spring Boot MongoDB自定义连接池配置

手打不易,如果转摘,请注明出处! 注明原文:http://zhangxiaofan.blog.csdn.net/article/details/144341407 一、引言 在 Spring Boot 应用中使用 MongoDB 时,合理配置连接池可以显著提升数据库访问的性能和稳定性。默…

游戏引擎学习第223天

回顾 今天我们正在进行过场动画序列的制作,因此我想深入探讨这个部分。昨天,我们暂时停止了过场动画的制作,距离最终结局还有一些内容没有完成。今天的目标是继续完成这些内容。 我们已经制作了一个过场动画的系列,并把它们集中…

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)📚…

LabVIEW配电器自动测试系统

随着航天技术的迅猛发展,航天器供配电系统的结构越来越复杂,对配电器的功能完整性、稳定性和可靠性提出了更高要求。传统人工测试方式难以满足高效率、高精度、可重复的测试需求。本项目开发了一套基于LabVIEW平台的宇航配电器自动测试系统,融…

PhotoShop学习09

1.弯曲钢笔工具 PhotoShop提供了弯曲钢笔工具可以直观地创建路径,只需要对分段推拉就能够进行修改。弯曲港币工具位于工具面板中的钢笔工具里,它的快捷键为P。 在使用前,可以把填充和描边选为空颜色,并打开路径选项,勾…

【C++】哈希unordered_map和set的使用以及哈希表,哈希桶的概念以及底层实现

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 本文章完整代码在下篇文章开头给出 上篇文章:map和set使用红黑树封装的底层实现 下篇文章:封装…

设计模式——建造者模式(生成器模式)总结

当我们需要创建一个非常复杂的对象时,可以使用建造者模式,分步骤建造一个对象,最后将完整的对象返回给客户端。 比如,我们要生成一个房子对象,建造一个房子,需要打地基、盖围墙、盖地板、安装门、安装窗户…

使用Python爬虫的2大原因和6大常用库

爬虫其实就是请求http、解析网页、存储数据的过程,并非高深的技术,但凡是编程语言都能做,连Excel VBA都可以实现爬虫,但Python爬虫的使用频率最高、场景最广。 这可不仅仅是因为Python有众多爬虫和数据处理库,还有一个…

Java 架构设计:从单体架构到微服务的转型之路

Java 架构设计:从单体架构到微服务的转型之路 在现代软件开发中,架构设计的选择对系统的可扩展性、可维护性和性能有着深远的影响。随着业务需求的日益复杂和用户规模的不断增长,传统的单体架构逐渐暴露出其局限性,而微服务架构作…