news 2026/5/12 13:33:52

UNIX域套接字

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UNIX域套接字

UNIX 域套接字类型

  • UNIX 域流式套接字
    • 类似于 TCP,提供面向连接、可靠的双向通信
    • 使用本地文件路径作为地址,适用于本地进程间通信
  • UNIX 域数据报套接字
    • 类似于 UDP,提供无连接、不可靠的通信
    • 同样使用本地文件路径作为地址

本地地址结构

structsockaddr_un{unsignedshortsun_family;// 协议类型,如 AF_UNIXcharsun_path[108];// 套接字文件路径};

UNIX 域流式套接字

  • 用法和 TCP 套接字基本一致,区别在于使用的协议和地址不同

服务端流程

  • 创建 UNIX 域流式套接字
  • 绑定本地地址(套接字文件)
  • 设置监听模式
  • 接收客户端的连接请求
  • 发送/接收数据

示例代码

#include<sys/socket.h>#include<sys/un.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<unistd.h>#defineMY_SOCK_PATH"/tmp/my_sock_file"#defineLISTEN_BACKLOG50#definehandle_error(msg)\do{perror(msg);exit(EXIT_FAILURE);}while(0)intmain(intargc,char*argv[]){intsfd,cfd;structsockaddr_unmy_addr,peer_addr;socklen_tpeer_addr_size;charbuf[BUFSIZ]={};sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1)handle_error("socket");memset(&my_addr,0,sizeof(structsockaddr_un));my_addr.sun_family=AF_UNIX;strncpy(my_addr.sun_path,MY_SOCK_PATH,sizeof(my_addr.sun_path)-1);if(bind(sfd,(structsockaddr*)&my_addr,sizeof(structsockaddr_un))==-1)handle_error("bind");if(listen(sfd,LISTEN_BACKLOG)==-1)handle_error("listen");peer_addr_size=sizeof(structsockaddr_un);cfd=accept(sfd,(structsockaddr*)&peer_addr,&peer_addr_size);if(cfd==-1)handle_error("accept");recv(cfd,buf,BUFSIZ,0);printf("%s\n",buf);close(cfd);close(sfd);remove(MY_SOCK_PATH);return0;}

客户端流程

  • 创建 UNIX 域流式套接字
  • 指定服务器端地址(套接字文件)
  • 建立连接
  • 发送/接收数据

示例代码

#include<sys/socket.h>#include<sys/un.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<unistd.h>#defineMY_SOCK_PATH"/tmp/my_sock_file"#definehandle_error(msg)\do{perror(msg);exit(EXIT_FAILURE);}while(0)intmain(intargc,char*argv[]){intfd;structsockaddr_unpeer_addr;charbuf[BUFSIZ]={"Hello World!"};fd=socket(AF_UNIX,SOCK_STREAM,0);if(fd==-1)handle_error("socket");memset(&peer_addr,0,sizeof(structsockaddr_un));peer_addr.sun_family=AF_UNIX;strncpy(peer_addr.sun_path,MY_SOCK_PATH,sizeof(peer_addr.sun_path)-1);if(connect(fd,(structsockaddr*)&peer_addr,sizeof(structsockaddr_un))==-1)handle_error("connect");printf("%s\n",buf);send(fd,buf,strlen(buf),0);close(fd);return0;}

UNIX 域数据报套接字

  • 流程类似于 UDP 套接字,无需建立连接
  • UNIX 域流式套接字服务器端流程如下:
    • 创建 UNIX 域流式套接字
    • 绑定本地地址(套接字文件)
    • 发送/接收数据

示例代码

服务端

#include<sys/socket.h>#include<sys/un.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<unistd.h>#defineMY_SOCK_PATH"/tmp/my_sock_file"#definehandle_error(msg)\do{perror(msg);exit(EXIT_FAILURE);}while(0)intmain(intargc,char*argv[]){intfd;structsockaddr_unmy_addr,peer_addr;socklen_tpeer_addr_size;charbuf[BUFSIZ]={};fd=socket(AF_UNIX,SOCK_DGRAM,0);if(fd==-1)handle_error("socket");memset(&my_addr,0,sizeof(structsockaddr_un));my_addr.sun_family=AF_UNIX;strncpy(my_addr.sun_path,MY_SOCK_PATH,sizeof(my_addr.sun_path)-1);if(bind(fd,(structsockaddr*)&my_addr,sizeof(structsockaddr_un))==-1)handle_error("bind");peer_addr_size=sizeof(structsockaddr_un);recvfrom(fd,buf,BUFSIZ,0,(structsockaddr*)&peer_addr,&peer_addr_size);printf("%s\n",buf);close(fd);remove(MY_SOCK_PATH);return0;}

客户端

#include<sys/socket.h>#include<sys/un.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<unistd.h>#defineMY_SOCK_PATH"/tmp/my_sock_file"#definehandle_error(msg)\do{perror(msg);exit(EXIT_FAILURE);}while(0)intmain(intargc,char*argv[]){intfd;structsockaddr_unpeer_addr;socklen_tpeer_addr_size;charbuf[BUFSIZ]={"Hello World!"};fd=socket(AF_UNIX,SOCK_DGRAM,0);if(fd==-1)handle_error("socket");memset(&peer_addr,0,sizeof(structsockaddr_un));peer_addr.sun_family=AF_UNIX;strncpy(peer_addr.sun_path,MY_SOCK_PATH,sizeof(peer_addr.sun_path)-1);peer_addr_size=sizeof(structsockaddr_un);printf("%s\n",buf);sendto(fd,buf,strlen(buf),0,(structsockaddr*)&peer_addr,peer_addr_size);close(fd);remove(MY_SOCK_PATH);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 11:18:21

【课程设计/毕业设计基于Springboot的小区停车管理系统】基于springboo的小区车辆管理系统管理社区车辆【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 16:12:40

TimeXL:大模型赋能的可解释多模态时间序列预测新方法

TimeXL提出结合LLM的可解释多模态时间序列预测框架&#xff0c;通过多模态原型编码器生成预测与解释&#xff0c;并利用LLM三重协作机制形成闭环优化。该方法解决传统模型"解释性缺失"与"上下文利用不充分"痛点&#xff0c;在多领域均优于现有方法&#xf…

作者头像 李华
网站建设 2026/5/9 3:27:22

Java毕设选题推荐:基于springboo的小区车辆管理系统查车位、预约、出场、论坛互动【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/3 16:36:34

大语言模型技术深度解析:微调、PEFT与优化技术实战

本文全面介绍大语言模型基础知识&#xff0c;包括Transformer架构、语言建模原理和预训练挑战。重点详解参数高效微调技术(PEFT)如LoRA、QLoRA、适配器等&#xff0c;以及提示工程、模型压缩方法&#xff08;量化、蒸馏、剪枝&#xff09;。还探讨分布式训练和推理优化技术&…

作者头像 李华
网站建设 2026/5/10 9:03:12

38-mini-vue 实现解析 element

实现解析 element 思路 区别与解析插值语法&#xff0c;解析 element 需要不同类型和方法, 尖角号和第一个字符是字母将解析完成后的代码都删掉 测试代码 describe("element",()> {it("simple element div",()>{const ast baseParse("<…

作者头像 李华
网站建设 2026/5/11 8:27:12

SolarWinds修复Web Help Desk四个关键漏洞

SolarWinds发布安全更新&#xff0c;修复了Web Help Desk中多个安全漏洞&#xff0c;其中包括四个可能导致身份认证绕过和远程代码执行的关键漏洞。漏洞详情此次修复的漏洞清单如下&#xff1a;CVE-2025-40536&#xff08;CVSS评分&#xff1a;8.1&#xff09;- 安全控制绕过漏…

作者头像 李华