news 2026/6/15 21:27:39

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/6/15 11:05:44

LCR001-两数相除

求解代码 //定义移位边界&#xff0c;防止左移溢出private static final int BOUND Integer.MIN_VALUE>>1;//被除数是最小负数&#xff0c;除数是-1&#xff0c;返回最大正数public int divide(int a,int b){if(aInteger.MIN_VALUE&&b-1){return Integer.MAX_VA…

作者头像 李华
网站建设 2026/6/15 10:13:28

Agent Skills入门指南:从“不就是Markdown“到大模型稳定执行的关键

Agent Skills是Anthropic推出的供大模型使用的技能包&#xff0c;通过包含做事流程和资源&#xff0c;解决模型稳定、可复用、可分发执行问题。采用渐进式披露机制分三层加载&#xff0c;避免上下文爆炸。Skills包含核心文档、脚本、参考资料和静态资源&#xff0c;适合重复执行…

作者头像 李华
网站建设 2026/6/15 10:11:06

AI工具存在严重安全脆弱性,治理刻不容缓

企业AI工具在网络攻击面前仍然极易受损&#xff0c;尽管各大企业正在竞相扩大AI工具的应用范围。网络安全公司Zscaler在周二发布的威胁报告中指出了这一问题。报告发现&#xff0c;企业正在向AI工具投入大量数据&#xff0c;"这让AI平台成为全球网络犯罪分子更大的攻击目标…

作者头像 李华
网站建设 2026/6/15 10:11:41

AI运维专家圆桌:新兴技术类别的诞生

随着AI驱动代码生成工具的爆发式增长&#xff0c;运维和安全领域也出现了强烈的AI驱动响应&#xff0c;这并不令人意外。按照定义&#xff0c;SRE和安全专业人员的核心职能就是跟上变化的步伐&#xff0c;快速响应以维护在线系统的可靠性和安全性。这引出了我们要讨论的话题&am…

作者头像 李华
网站建设 2026/6/15 13:09:31

“抖音崩了”冲上热搜,无法正常搜索,刷视频功能未受影响

&#x1f4cc; 事件详情 根据大量用户反馈&#xff0c;问题主要表现为&#xff1a;在抖音App中输入关键词后&#xff0c;无法显示正常搜索结果&#xff0c;页面会直接呈现空白或显示“网络错误”。问题主要影响搜索功能&#xff0c;用户仍能正常浏览“推荐”或“关注”页的视频…

作者头像 李华