C语言---Unix套接字用于本地通信

2023-11-12

1、作用:用于本地间通信

2、使用:

        创建套接字的时候使用本地协议通信,AF_UNIX(或者AF_LOCAL),分为流式套接字和用户数据报套接字。

unix_socket = socket(AF_LOCAL, SOCK_STREAM, 0);
unix_socket = socket(AF_LOCAL, SOCK_DGRAM, 0);

3、进程间通信:(6种情况)

        3.1进程间数据共享:

                管道、消息队列、共享内存、unix套接字

                        易用性:消息队列>unix套接字>管道>共享内存(经常要和信号量一起用)

                        效率上:共享内存>unix套接字>管道>消息队列

                        共享内存相当于把一块内存从内核空间放到内存空间去操作。

                        效率上,常常共享内存和信号量一起使用,或者unix套接字。

        3.2异步通信:

                信号

        3.3同步和互斥:

                信号量       

4、Unix域套接字

/*本地地址结构*/

#include <sys/un.h>
strcut sockaddr_in{
    sa_family_t sun_family; 
    char sun_path[108];  //套接字文件的路径
};

/*填充地址结构*/
strcut sockaddr_un myaddr;
bzero(&myaddr, sizeof(myaddr));
myaddr.sun_family = AF_UNIX;
strcpy(myaddr.sun_path, "/tmp/mysock");

5、

        5.1流式套接字服务器端

                socket(AF_UNIX, SOCK_STREAM, 0);

                bind(,本地地址,); //

                listen();

                accept();    //可以使用多路复用、多进程、多线程处理

                recv()  / send()

                close()

                注意:bind()函数详解

                        int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

                        之前互联网通信,这里绑定绑定的是通用地址结构体sockaddr。

                        现在本地通信,绑定的是sockaddr_un结构体,格式如下:     

//A UNIX domain socket address is represented in the following structure:

#define UNIX_PATH_MAX    108

struct sockaddr_un {
    sa_family_t sun_family;               /* AF_UNIX */
    char        sun_path[UNIX_PATH_MAX];  /* pathname */
};

//sun_family always contains AF_UNIX  / AF_local
// unix_path_max  从96~108,是unix域套接字的文件路径名:
// 注意:1.这个文件(位于内存中)必须事先不存在;2.一般给绝对路径名;

        5.2流式套接字客户端  

                socket(AF_UNIX, SOCK_STREAM, 0);

                bind(,本地地址,); //

                listen();

                accept();    //可以使用多路复用、多进程、多线程处理

                recv()  / send()

                close()

6、实例代码

/*服务器:*/
void sig_child_handle(int signo){
    if(SIGCHLD == signo){
        //NULL:状态不许要,WNOHANG非阻塞方式
        waitpid(-1, NULL, WNOHANG);
    }   
}

void cli_data_handle(int *arg);

int main(int argc, char *argv[])
{
    //1.create socket
    int sockfd;
    //struct sockaddr_in sin;
    /*  
        typedef void (*sighandler_t)(int);
        sighandler_t signal(int signum, sighandler_t handler);
    */
 signal(SIGCHLD, sig_child_handle);

    if((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0))<0){
        perror("create socket");
        return -1;
    }

struct sockaddr_un sun;
    bzero(&sun, sizeof(sun));
    sun.sun_family = AF_UNIX;

    if(!access(UNIX_DOMAIN_FILE, F_OK)){
        unlink(UNIX_DOMAIN_FILE);
    }

    strncpy(sun.sun_path, UNIX_DOMAIN_FILE, strlen(UNIX_DOMAIN_FILE));

    if( ( bind(sockfd, (struct sockaddr *)(&sun), sizeof(sun)) ) == -1){
        perror("bind");
        exit(1);
    }
//3.listen
    if(listen(sockfd, BACKLOG)<0){
        perror("listen");
        exit(1);
    }
    printf("server start\n");

 int newfd;
    while(1){
        pid_t pid = -1;
        if((newfd = accept(sockfd, NULL, NULL))<0){
            perror("accept");
            break;
        }
        //创建一个子进程,用于处理连接的客户端的交互数据
        if((pid = fork()) < 0){
            perror("fork");
            exit(1);
        }
        if(pid > 0){//父进程
            close(newfd);
        }else if(pid == 0){//子进程
            close(sockfd);
            cli_data_handle(&newfd);
            exit(1);
        }
        break;
    }
    //6.close
    close(sockfd);
    return 0;
}
void cli_data_handle(int *arg){
    int newfd = *(int *)arg;
    printf("child handling process:newfd=%d\n", newfd);
    //5.write() 与newfd读写数据
    char buf[128];
    //char resp_buf[138];
    int ret = -1;
    while(1){
        bzero(buf, strlen(buf));
        do{
            ret = read(newfd, buf, 127);
        }while(ret<0 && errno==EINTR);

        if(ret < 0){
            perror("read");
            exit(1);
        }
        //客户端已经关闭
        if(!ret){
            break;
        }
        printf("recive data:%s\n", buf);

        if( !strncasecmp(buf, QUIT_STR, strlen(QUIT_STR)) ){

            printf("client(%d) exiting\n", newfd);
            break;
        }
    }
    close(newfd);
}
                    

                

/*./client unix_domain_file */
#include "inet.h"

void usage(char *s){
    printf("\n%s unix_domain_file\n", s); 
}

int main(int argc, char *argv[])
{   

    if(argc != 2){ 
        usage(argv[0]);
        exit(1);
    }   
    //1.create socket
    int sockfd;
    if((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0))<0){
        perror("create socket");
        exit(1);
    }   
//2.连接服务器
    //填充sockaddr_in 结构体变量,

    struct sockaddr_un sun;
    bzero(&sun, sizeof(sun));

    sun.sun_family = AF_LOCAL;

    /*确保文件先存在并且可写,如果不存在,退出*/
    if(access(UNIX_DOMAIN_FILE, W_OK) < 0){
        exit(1);
    }

    strncpy(sun.sun_path, UNIX_DOMAIN_FILE, strlen(UNIX_DOMAIN_FILE));

    if(connect(sockfd, (struct sockaddr *)&sun, sizeof(sun)) < 0){
        perror("connect");
        exit(1);
    }
    printf("unix start....\n");
 //3.read()读写数据
    int ret = -1;
    char buf[128];
    while(1){
        bzero(buf, 128);
        if(fgets(buf, 127, stdin) == NULL){
            continue;
        }
        do{
            ret = write(sockfd, buf, strlen(buf));
        }while(ret<0 && errno==EINTR);
        if(! strncasecmp(buf, QUIT_STR, strlen(buf)-1)){
            printf("client is exiting\n");
            break;
        }
    }
    //4.close()关闭套接字
    close(sockfd);
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言---Unix套接字用于本地通信 的相关文章

  • Map&Set哈希桶(基础+常用方法总结)

    作者 渴望力量的土狗 博客主页 渴望力量的土狗的博客主页 专栏 数据结构与算法 工欲善其事必先利其器 给大家介绍一款超牛的斩获大厂offer利器 牛客网 点击免费注册和我一起刷题吧 目录 1 map set简介 1 1 概念及场景 1 2
  • centos7-elk之elasticsearch

    准备环境 centos7 4 jdk 1 8 安装jdk可见链接 https blog csdn net xuejinyan123 article details 102685458 下载 elasticsearch 版本 6 0 1 存放
  • mysql安装包及驱动下载

    1 下载MySQL安装包 mysql官网下载安装包地址 https downloads mysql com archives community 在页面选择希望下载的版本 运行环境 运行环境版本 下方会出现各种版本 MySQL数据库安装有y
  • 用于 3d 渲染应用程序的常见物体 IOR(折射率)值

    以下内容来源于 https www btbat com 12032 html 用于 3d 渲染应用程序的 IOR 折射率 值 那么支持的常用 3D 程序如下 如 NewTek Lightwave 3d Blender 3d Autodesk
  • 轻松实现crontab的使用

    一 什么情况下使用crontab crontab命令常见于Unix和类Unix的操作系统之中 用于设置周期性被执行的指令 二 如何编写crontab 1 安装crontab环境 bash内键入 crontab 如果提示command not
  • 人类学习 vs. 机器学习

    摘要 机器学习与人类学习的范式有一定的联系 本文发掘这些联系 作用是指导人类的学习 1 什么是学习 对于人类而言 学习是改造大脑皮层的过程 我们会发现 不同人学习不同东西的能力也不一样 如有些人数学厉害 有些人音乐厉害 同时 也有些牛人 学

随机推荐

  • 混沌神经网络的实际应用,进化算法优化神经网络

    人工神经网络的发展趋势 人工神经网络特有的非线性适应性信息处理能力 克服了传统人工智能方法对于直觉 如模式 语音识别 非结构化信息处理方面的缺陷 使之在神经专家系统 模式识别 智能控制 组合优化 预测等领域得到成功应用 人工神经网络与其它传
  • QFileDialog.getOpenFileName获取打开的文件路径

    前段时间要做一个打开文件并上传的功能 在不多加一个窗口的情况下选中那个打开的文件 def addButtonClicked self index try file name QFileDialog getOpenFileName self
  • Ubuntu20.04下编译测试RocksDB以及遇到的问题记录

    rockdb编译 git clone https github com facebook rocksdb git 如果上面的命令报错无法连接 则换成下面这句 git clone git github com facebook rocksdb
  • 大数据简历要点与模拟面试和项目介绍模板二

    15 模拟面试和项目介绍模板10 一 自我介绍 目前不知道怎么做 您好 我叫xxx 毕业于xxx学校 因为在大学里学过javase mysql web 数据结构与算法等计算机基础知识 在一份软件测试的实习中接触到数据仓库 用户画像 推荐系统
  • Mybatis如何实现多表查询

    一 按照配置文件的方式 在Java端mybatis框架里写联查sql语句 通过orm模型解析 这里需要考虑一对一以及一对多的关系 按student和score表举例 student对于score是一对多的关系 score对于student来
  • 访谈录:中国的软件业需要悟道

    1 记者 目前 随着中国IT业的发展 国外IT企业对中国IT业也越来越重视 能否简单介绍一下目前中国外包情况 陆其明 近几年 中国IT业的发展确实比较快 特别是软件行业 你可以看到 全国各地都在建软件园 各级政府对软件企业也都有政策倾斜 软
  • Three.js - 从 PLY 模型中创建粒子系统

    PLY全称 Polygon or Stanford Triangle Format 多边形或三角形格式 可以有效地保存和加载简单 静态的3D内容 支持二进制和ascii格式 可以存储顶点位置 颜色 法线和uv坐标 不能保存纹理 示例 htt
  • 登录模块丨前端uniapp微信小程序项目

    小兔鲜儿 微信登录 涉及知识点 微信授权登录 文件上传 Store 状态管理等 微信登录 微信小程序的开放能力 允许开发者获取微信用户的基本信息 昵称 性别 手机号码等 开发者常用来实现注册 登录的功能 登录方式 常见登录 注册方式 用户名
  • 9.java程序员必知必会类库之加密库

    前言 密码学在计算机领域源远流长 应用广泛 当前每时每刻 每一个连接到互联网的终端 手机 电脑 iPad都会和互联网有无数次的数据交互 如果这些数据都是明文传输那将是难以想象的 为了保护用户隐私 防止重要数据被窃取 篡改 我们需要对我们的数
  • 使用迭代器(iterator)遍历vector、map等

    所涉及方法 添加元素 array push back 正向迭代器 vector iterator 迭代器变量名 反向迭代器 vector reverse iterator 迭代器变量名 在不知道所包含数据个数的情况下用以遍历元素 vecto
  • [初学Python] IndentationError:unexpected indent

    在用Python实现求100以内的质数的编译程序或者说解释程序时出现了以下错误 根据编译后 解释后 的错误提示 说是num的 n 是一个IndentationError unexpected indent 什么意思呢 indentation
  • mac本工具使用配置

    1 CotEditor 文本编辑器 文本换行或者不换行设置 格式 换行 文本分栏展示 方便对比 显示 分栏显示 隐藏元素可见模式 格式 隐藏不可见元素
  • 解决Eclipse创建Android项目时出现No resource found that matches the given name ‘Theme.AppCompat.Light’的问题

    首先 对于该问题的详细分析大家可以查看Theme AppCompat Light问题的深入分析一文 里面详细介绍了该问题出现的原因 简单来讲 就是新的eclipse默认模版主题UI需要使用比较高版本api 如果需要支持低版本 需要导入app
  • 华为OD机试 - 九宫格按键输入(Java)

    题目描述 九宫格按键输入 输出显示内容 有英文和数字两个模式 默认是数字模式 数字模式直接输出数字 英文模式连续按同一个按键会依次出现这个按键上的字母 如果输入 或者其他字符 则循环中断 字符对应关系如图 要求输入一串按键 输出屏幕显示 输
  • ad原理图怎么导出pdf_如何把PDF导出为图片?方法很简单!

    很多人想将PDF文件转换成JPG文件 却不知道怎么转 或者通过网上一些方法 导出来的图片分辨率却很低 那我们怎么让PDF文件转换成JPG文件相对应的分辨率 今天小编给大家分享PDF快速导出JPG的技巧 PDF转jpg图片方法一 另存为法 另
  • TOP 100值得读的图神经网络----自监督学习与预训练

    清华大学的Top 100 GNN papers 其中分了十个方向 每个方向10篇 此篇为自监督学习与预训练方向的阅读笔记 Top100值得一读的图神经网络 大家好 我是蘑菇先生 今天带来Top100 GNN Papers盘点文 此外 公众号
  • C语言经典编程题---交换两个数

    1 给定两个整形变量的值 将两个值的内容进行交换 include
  • 正确解决vs运行的输出框闪退问题

    如果是想看见下面这样的输出框 很简单 要在调试停止时自动关闭控制台 请启用 工具 gt 选项 gt 调试 gt 调试停止时自动关闭控制台 截图如下
  • 【OS】【期末选择题】【2023春】【仅供参考】

    文章目录 题型 一 选择 第一章 10 第二章 19 第三章 23 第四章 32 第五章 15 第六章 15 二 填空题 三 简答题 1 信号量 2 调度算法 3 页面置换 4 虚拟地址到物理地址的映射 Reference 题型 题型 题量
  • C语言---Unix套接字用于本地通信

    1 作用 用于本地间通信 2 使用 创建套接字的时候使用本地协议通信 AF UNIX 或者AF LOCAL 分为流式套接字和用户数据报套接字 unix socket socket AF LOCAL SOCK STREAM 0 unix so