本地套接字

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。


本地套接字


专栏:《Linux从小白到大神》《网络编程》


本地套接字通信需要一个文件(伪文件,不管写不写数据,伪文件在磁盘上的大小都是0,因为伪文件实际上是内核中的一块缓冲区)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLJHCvOg-1678264202956)(Typora_picture_reference/1662204686756.png)]

//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,这就是伪文件,本地套接字与之类似。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqC4AxaG-1678264202957)(Typora_picture_reference/1662204859165.png)]

本地套接字通信示意图如下,可以通过TCP或UDP实现本地套接字。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXBzdMub-1678264202959)(Typora_picture_reference/1662204892306.png)]

下面介绍通过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

在这里插入图片描述
在这里插入图片描述


posted @ 2023-03-08 16:34  Mindtechnist  阅读(85)  评论(0编辑  收藏  举报  来源