news 2026/4/9 14:42:18

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/3/31 6:10:33

计算机Java毕设实战-基于springboo的小区车辆管理系统管理车位、预约、公告与论坛,小区停车全流程数字化小区车辆管理的智能化【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/3/27 7:46:24

JBoltAI:Java人工智能开发框架的实用指南

在 Java 企业寻求 AI 转型的过程中&#xff0c;JBoltAI 作为一款企业级 AI 应用开发框架&#xff0c;从场景开发、学习支持到解决方案落地&#xff0c;为开发者提供了多维度的支持。下面结合其核心模块&#xff0c;聊聊它在实际开发中的应用方向。一、场景开发范例&#xff1a;…

作者头像 李华
网站建设 2026/3/28 22:03:12

Java毕设选题推荐:基于springboot的智慧旅游系统目的地资源信息查询 - 行程规划 - 体验互动【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/4/8 8:43:27

大模型领域高级岗位招聘要求全解析,程序员从入门到精通指南

本文汇总了多个大模型相关高级技术与管理岗位的招聘要求&#xff0c;包括产业互联网CTO/COO、首席AI架构师、法律AI技术总监等。这些岗位普遍要求应聘者具备大模型训练、推理、优化和部署的专业知识&#xff0c;以及团队管理和业务协同能力。文章详细列出各岗位职责、任职资格和…

作者头像 李华