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

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;}
http://www.jsqmd.com/news/318741/

相关文章:

  • AI大模型这么火爆!程序员有必要学习吗?大厂面试官都在问了!
  • 2026铝板铝型材厂家综合评测(附优选名单)|采购避坑,适配多行业
  • Redis+cpolar,高效、自由的数据访问方法
  • 双闭环PID控制Buck变换器的仿真探索
  • 运用Java将HTML内容转换为Word文档
  • 学习记录260129
  • 基于nerdctl+BuildKit+containerd构建容器镜像
  • vulnstack红队实战二
  • 英伟达推出合成数据集支持新加坡AI发展
  • AI元人文构想:证成
  • 谷歌联合打击全球最大住宅代理网络IPIDEA
  • OS55.【Linux】System V消息队列的简单了解
  • 2026国内外主流大模型全景对比:技术演进与场景适配深度解析
  • 38-mini-vue 实现解析 element
  • Java零基础必看,1小时搞定微服务,从0到1搭建springcloud+nacos实战项目,搞定企业刚需技术!
  • 第6章:字符设备驱动的高级操作1:ioctl 系统调用
  • SQL 注入攻防进阶
  • 让 Q 值估计更准确:从 DQN 到 Double DQN 的改进方案
  • 《贾子智慧理论体系:从认知到文明的统一框架》| Kucius Wisdom Framework: A Unified Framework from Cognition to Civilization
  • 使用Dockerfile构建Flask应用镜像
  • vulnstack红队实战一
  • 全球首次突破异形框定位难题,百度开源全新OCR模型 PaddleOCR-VL-1.5
  • 智能指针详解
  • PVE 9.0 定制 Debian 13 镜像 支持 Cloud-Init 敏捷部署虚拟机【模板篇】
  • Java面试中的异常继承难题:自定义Exception避坑指南
  • Spring Boot的项目创建
  • 小程序毕设项目推荐-基于SpringBoot的医院设备管理及报修系统微信小程序基于springboot的医院设备管理及报修小程序的设计与实现【附源码+文档,调试定制服务】
  • 小程序毕设选题推荐:基于springboot的医院设备管理及报修小程序的设计与实现基于微信小程序的医院设备管理及报修系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 基于SpringBoot的房屋租售系统毕业论文+PPT(附源代码+演示视频)
  • 销售实战资源合集