命名UNIX域套接字
2022/1/14 23:15:08
本文主要是介绍命名UNIX域套接字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在网络上进行通信的时候,我们一般会使用socket
进行通信,实际上socket
也可以用于同一台主机上的两个进程间的通信,称为本地套接字。本地套接字具有如下的优势:
UNIX
域套接字仅仅复制数据,不执行协议处理,不需要添加或删除网络报头,无需计算校验和。UNIX
域数据报服务是可靠的,不会丢失也不会传递出错。
UNIX
套接字的地址有struct sockaddr_un
结构体表示。
#include <sys/un.h> struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* pathname */ };
sun_path
成员包含一个路径,当将一个地址绑定到一个UNIX
套接字上,系统会用该路径创建一个S_IFSOCK
类型的文件。
如果我们绑定一个已经存在的文件,bind
会出错。当程序退出时,也并不会删除这个文件,所以在程序退出前需要对文件解除关联。
int fd; int size; struct sockaddr_un addr; //unlink("./hello"); memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, "./hello"); fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { perror("socket\n"); return -1; } size = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path); if (bind(fd, (struct sockaddr *)&addr, size) < 0) { close(fd); perror("bind\n"); } close(fd);
如上图所示,执行bind
之后会生成一个S_IFSOCK
类型的文件。第二次执行的时候,由于该文件存在,会导致bind
失败。
扩展:
#define <stddef.h> #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
计算成员MEMBER
在结构体类型TYPE
中的偏移量,巧妙使用0地址的特点。
+-----------+ | | | | | | | | | | MEMBER +-----------+ +++ | | ^ | | | | | + | | offsetof | | + | | ^ TYPE 0 +-----------+ +++
ascii换图工具
了解了unix
套接字的时候之后,我们就可以使用其实现服务端、客户端的通信。
server:
struct sockaddr_un un; fd = socket(); bind(); listen() accept()
client:
struct sockaddr_un un; //绑定server端创建的sun_path fd = socket(); connect(); write();
这篇关于命名UNIX域套接字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-12百万架构师第十五课:源码分析:Spring 源码分析:SpringMVC核心原理及源码分析|JavaGuide
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide