本地套接字
欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。
本地套接字
本地套接字通信需要一个文件(伪文件,不管写不写数据,伪文件在磁盘上的大小都是0,因为伪文件实际上是内核中的一块缓冲区)。
//sys/un.h
#define UNIX_PATH_MAX 108
struct sockaddr_un {
__kernel_sa_family_t sun_family;
char sun_path[UNIX_PATH_MAX];
};
在进程间通信专题中,我们讲到过管道,管道的类型是p,本地套接字的类型是s,管道和本地套接字本质都是内核缓冲区。比如管道,通过操作磁盘管道文件可以操作内核缓冲区,而实际上读写数据都是操作的内核缓冲区,所以磁盘管道文件大小一直是0,这就是伪文件,本地套接字与之类似。
本地套接字通信示意图如下,可以通过TCP或UDP实现本地套接字。
下面介绍通过TCP来实现本地套接字的过程
-
服务器端
-
-
创建套接字
-
- int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
-
绑定 -
-
struct sockaddr_un serv;
-
serv.sun_family = AF_LOCAL; //AF_UNIX/AF_LOCAL
-
strcpy(serv.sun_path, “server.socket”); —— 现在还不存在(linux下的文件后缀都是自己起的)
-
bind(lfd, (struct sockaddr8)&serv, len); —— 绑定成功套接字server.socket文件就被创建(我们只负责起个名字,它是在bind成功后自动被创建的)
-
-
-
设置监听:listen();
-
等待接收连接请求
struct sockaddr_un client;
-
int len = sizeof(client);
-
int cfd = accept(ldf, &client, &len);
-
-
- 通信
- send
- recv
- 通信
-
- 断开连接
- close(cfd);
- close(lfd);
- 断开连接
-
客户端
-
-
创建套接字
int fd = socket(AF_LOCAL,SOCK_STREAM, 0);
-
绑定一个套接字文件
struct sockaddr_un client;
client.sun_family = AF_LOCAL;
strcpy(client.sun_path, “client.socket”);
bind(fd, (struct sockaddr*)&client, len);
-
连接服务器
struct sockaddr_un serv;
serv.sun_family = AF_LOCAL;
strcpy(serv.sun_path, “server.socket”); - -现在还不存在
connect(fd, &serv, sizeof(server));
-
通信
- recv
- send
-
-
- 关闭
- close
- 关闭