本地套接字(domain)

news2024/9/30 23:39:53

        本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实现的复杂度,效率比 TCP/UDP 套接字都要高许多。本地套接字是 IPC,也就是本地进程间通信的一种实现方式。

本地套接字的作用: 本地的进程间通信
可以实现 有关系的进程间的通信 和 没有关系的进程间的通信
本地套接字实现流程和网络套接字类似,一般采用TCP的通信流程。 

地址结构对比(本地对比网络)

struct sockaddr_in {
__kernel_sa_family_t sin_family; 			/* Address family */  	地址结构类型
__be16 sin_port;					 	    /* Port number */		端口号
struct in_addr sin_addr;					/* Internet address */	IP地址
};

struct sockaddr_un {
__kernel_sa_family_t sun_family; 		/* AF_UNIX */			地址结构类型
char sun_path[UNIX_PATH_MAX]; 		    /* pathname */		socket文件名(含路径)
};

编程思想对比(本地对比网络)

本地套接字—进程间通信流程 

服务器端

1. 创建监听的套接字
      int lfd = socket(af_local, sock_stream, 0);
          第一个参数: AF_UNIX, AF_LOCAL

2. 监听的套接字绑定本地的 套接字文件-> server端
      struct sockaddr_un addr;
      // 绑定成功之后, 指定的sun_path中的套接字文件会自动生成
      bind(lfd, addr, len);

3. 监听
      listen(lfd, 100);

4. 等待并接受连接请求
      struct sockaddr_un cliaddr;
      int connfd  = accept(lfd, cliaddr, len);

5. 通信
      接收数据: read/recv
      发送数据: write/send

6. 关闭连接
      close();

客户端

1. 创建通信的套接字
      int fd = socket(af_local, sock_stream, 0);

2. 监听的套接字绑定本地的IP 端口
      struct sockaddr_un addr;
      // 绑定成功之后, 指定的sun_path中的套接字文件会自动生成
      bind(fd, addr, len);

3. 连接服务器
      struct sockaddr_un serveraddr;
      connect(fd, serveraddr, sizeof(serveraddr));

4. 通信
      接收数据: read/recv
      发送数据: write/send

5. 关闭连接

代码实现

/* server.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stddef.h>

#include "wrap.h"

#define SERV_ADDR  "serv.socket"

int main(void)
{
    int lfd, cfd, len, size, i;
    struct sockaddr_un servaddr, cliaddr;
    char buf[4096];

    lfd = Socket(AF_UNIX, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sun_family = AF_UNIX;
    strcpy(servaddr.sun_path, SERV_ADDR);

    len = offsetof(struct sockaddr_un, sun_path) + strlen(servaddr.sun_path);     /* servaddr total len */

    unlink(SERV_ADDR);                              /* 确保bind之前serv.sock文件不存在,bind会创建该文件 */
    Bind(lfd, (struct sockaddr *)&servaddr, len);           /* 参3不能是sizeof(servaddr) */

    Listen(lfd, 20);

    printf("Accept ...\n");
    while (1) {
        len = sizeof(cliaddr);  //AF_UNIX大小+108B

        cfd = Accept(lfd, (struct sockaddr *)&cliaddr, (socklen_t *)&len);

        len -= offsetof(struct sockaddr_un, sun_path);      /* 得到文件名的长度 */
        cliaddr.sun_path[len] = '\0';                       /* 确保打印时,没有乱码出现 */

        printf("client bind filename %s\n", cliaddr.sun_path);

        while ((size = read(cfd, buf, sizeof(buf))) > 0) {
            for (i = 0; i < size; i++)
                buf[i] = toupper(buf[i]);
            write(cfd, buf, size);
        }
        close(cfd);
    }
    close(lfd);

    return 0;
}
/* client.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stddef.h>

#include "wrap.h"

#define SERV_ADDR "serv.socket"
#define CLIE_ADDR "clie.socket"

int main(void)
{
    int  cfd, len;
    struct sockaddr_un servaddr, cliaddr;
    char buf[4096];

    cfd = Socket(AF_UNIX, SOCK_STREAM, 0);

    bzero(&cliaddr, sizeof(cliaddr));
    cliaddr.sun_family = AF_UNIX;
    strcpy(cliaddr.sun_path,CLIE_ADDR);

    len = offsetof(struct sockaddr_un, sun_path) + strlen(cliaddr.sun_path);     /* 计算客户端地址结构有效长度 */

    unlink(CLIE_ADDR);
    Bind(cfd, (struct sockaddr *)&cliaddr, len);                                 /* 客户端也需要bind, 不能依赖自动绑定*/

    
    bzero(&servaddr, sizeof(servaddr));                                          /* 构造server 地址 */
    servaddr.sun_family = AF_UNIX;
    strcpy(servaddr.sun_path, SERV_ADDR);

    len = offsetof(struct sockaddr_un, sun_path) + strlen(servaddr.sun_path);   /* 计算服务器端地址结构有效长度 */

    Connect(cfd, (struct sockaddr *)&servaddr, len);

    while (fgets(buf, sizeof(buf), stdin) != NULL) {
        write(cfd, buf, strlen(buf));
        len = read(cfd, buf, sizeof(buf));
        write(STDOUT_FILENO, buf, len);
    }

    close(cfd);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

consul集群搭建教程

简言 1. 使用consul单节点有宕机&#xff0c;数据丢失的风险&#xff0c;为了安全&#xff0c;使用consul集群更靠谱 2. consul的各个版本下载地址在 Consul Versions | HashiCorp Releases 3. 本文使用consul的版本是consul1.15.1&#xff0c;所以请下载名字为 consul_1.15…

数据密集型应用存储与检索设计

本文内容翻译自《数据密集型应用系统设计》&#xff0c;豆瓣评分高达 9.7 分。 什么是「数据密集型应用系统」&#xff1f; 当数据&#xff08;数据量、数据复杂度、数据变化速度&#xff09;是一个应用的主要挑战&#xff0c;那么可以把这个应用称为数据密集型的。与之相对的是…

免费文本转语音(在线文本转语音)

个人开发的网站&#xff0c;已经维护快一年了&#xff0c;接口稳定&#xff0c;基于微软官方接口&#xff0c;可在线生成&#xff0c;手机电脑平板通用。每天提供一定额度&#xff08;时而5000时而2000时而500&#xff0c;根据服务器压力调整&#xff09;的免费字数供大家使用。…

数画-AI绘画-免费的人工智能AI绘画网站

文章目录 AIGC什么是AI作画&#xff1f;Prompt数画AIGC的未来发展结语 AIGC AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容&#xff0c;GC的意思是创作内容。与之相对应的概念中&#xff0c;比较熟知的还有P…

瑞芯微RK3568对比RK3399性能解析

RK3568核心板简介 ​ RK3568核心板是武汉万象奥科基于瑞芯微Rockchip的RK3568设计的一款高性能核心板。它采用四核Cortex-A55架构&#xff0c;最高主频可达2.0GHz&#xff0c;同时集成Mali-G52 2EE GPU&#xff0c;支持4K60fps H.265/H.264/VP9解码和4K60fps H.265/H.264编码…

北大POJ 1000 ~ 1007

1. AB &#x1f351; POJ1000 ab &#x1f354; 签到题 import java.io.*; import java.util.*; public class Main {public static void main(String args[]) throws Exception{Scanner cinnew Scanner(System.in);int acin.nextInt(),bcin.nextInt();System.out.println(…

【Vue3】Vue项目各个配置文件的相关用途

通过Vue Cli创建好初始代码后&#xff0c;对于各个文件以及配置文件的用途&#xff0c;比较模糊。弄清楚配置文件的大致作用&#xff0c;十分有利于项目整体性的把控&#xff0c;在实际项目中例如修改配色、样式、统一页面结构等&#xff0c;都可以事半功倍。 1、package.json …

分享下这些软件外包公司(2023最新版),程序员有福了

金三银四已经过去一半&#xff0c;再过几个月又将迎来毕业季&#xff0c;大家有没有找到心仪的工作机会呀&#xff1f; 今年找工作的行情确实不行&#xff0c;在网上也能听见很多人在讨论说今年工作实在是太难找了。 如果实在找不到合适的工作&#xff0c;那外包也可以考虑下了…

【LeetCode】102.二叉树的层序遍历

1.问题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a…

Centos7配置静态ip地址

目录 查找配置网络的文件 配置静态ip VMware查找网关ip Windows Mac 查找配置网络的文件 先输入以下命令查看下ip是通过哪个文件来配置的 ip addr 修改网络配置文件&#xff08;注意看我上面查到的是ens32, 所以在ifcfg-后面拼的是这个&#xff09; vi /etc/sysco…

VM——下载 centos

进入centos官网 这里显示了我所在地区可用的ISO镜像&#xff0c;这里我选阿里的镜像库 然后选择centos的版本&#xff0c; 【DVD】标准版本 【Everything】集成所有软件版本 【LiveGNOME】GNOME桌面版本 【LiveKDE】KDE桌面版本 【Minimal】最小安装版本 【NetInstall】网…

Qt Quick - TabBar

Qt Quick - TabBar使用总结 一、概述二、调整选项卡三、Flickable标签三、定制化 一、概述 TabBar其实就是选项卡&#xff0c;TabBar是由TabButton控件填充&#xff0c;TabBar可以与任何提供currentIndex属性的布局或容器控件一起使用&#xff0c;如StackLayout或SwipeView。T…

扬帆优配|鼎智科技大涨22%登上龙虎榜 新股“赚钱效应”再现

上市第三天&#xff0c;鼎智科技(873593)因大涨22%登上“龙虎榜”&#xff0c;北交所发表的数据显示&#xff0c;组织现身买入榜&#xff0c;同时卖出榜也呈现了组织座位。 鼎智科技上市后接连上涨&#xff0c;使得北交所新股呈现久违的“赚钱效应”。从近期北交所新股的发行结…

从高考开始跌跌撞撞到目前的研究生拟录取

文章目录 前言一、高考的失利二、本科生活三、研究生初试的力不从心四、研究生复试的措手不及后话 前言 其实我一直都很想写写关于我的学习生涯之类的记录&#xff0c;但是不知道该以何种心态来书写… 看到学信网的拟录取通知当时其实是有点麻木的&#xff0c;感觉有很多话想说…

Pytorch深度强化学习:Gym安装与环境搭建教程(附基本指令表)

目录 1 Gym介绍2 Gym安装3 基本指令3.1 make()3.2 reset()3.3 step()3.4 close() 4 常见问题参考资料 1 Gym介绍 强化学习是在潜在的不确定复杂环境中&#xff0c;训练一个最优决策指导一系列行动实现目标最优化的机器学习方法。自从AlphaGo的横空出世之后&#xff0c;确定了强…

从promise到await

在之前的这篇文章中&#xff0c;已经讲完了从异步操作到promise的诞生&#xff0c;但是promise也仅仅是做到了异步操作和结果的分离&#xff0c;当我们有多个异步操作&#xff0c;且结果前后有依赖的时候&#xff0c;不可避免的&#xff0c;就会出现一系列的.then方法。还是不大…

【JS每N日一练】 将CSDN文章自动生成Markdown列表

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 分析及编码页面分析枚举列表处理li&#xff0c;获取Markdown完成功能拼装 2️⃣ 完整代码及运行结果完整代码运行结果 &#x1f6ec; 总结 &#x1f6eb; 问题 描述 作为程序员必备素质-懒&#xff0c;今天又给自己了一个造了个需…

QGIS--开发OpenSCENARIO动态场景(一)--Ubuntu20.04 安装QGIS

qgis的git&#xff1a; GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址&#xff1a;https://plugins.qgis.org/plugins/ 1.Prerequisi…

java IO流_2

目录 字节缓冲流 序列化 使用对象流实现序列化 标准输入输出流 转换流 打印流 PrintStream PrintWriter properties读写文件 字节缓冲流 字节流 import java.io.FileInputStream; import java.io.FileOutputStream;public class FileCopy {public static void main(Str…

年薪30W+,待遇翻倍,我的经历值得每个测试人借鉴

从自考大专到出走公司&#xff0c;从半年无业露宿深圳北站&#xff0c;从8k…到11.5k…再到20k&#xff0c;我的经历值得每个测试人借鉴 或许学历并没有那么重要 12年高考之后&#xff0c;在朋友的介绍下&#xff08;骗了过去&#xff09;&#xff0c;没有好好的读大学&#x…