浅谈【网络编程】之Unix与多路复用

news2024/11/30 14:42:03

目录

1、Unix域协议

2、多路复用

select

poll / epol


谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注

没错,说的就是你,不用再怀疑!!!

希望我的文章内容能对你有帮助,一起努力吧!!!


1、Unix域协议

Unix域协议是一种 IPC 通信的方式,利用 Socket 进行进程间的通信

利用 Socket 编程接口来实现进行本地进程间的通信

Unix有自己的协议簇:

  • Unix域协议:
    • AF_UNIX / AF_LOCAL
  • Socket 套接字
    • SOCK_DGRAM 数据报套接字 UDP
    • SOCK_STRTEAM 流式套接字 TCP
  • Unix域协议,编程接口和流程同 IPV4 协议簇一样,只不过Unix协议网络地址

下面是一个小例子:

Unix_recv:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <cstring>
#include <unistd.h>

#define UNIX_PATH ("/home/thirteen/unix.socket")

int main()
{
    // 创建套接字
    int sock = socket(AF_UNIX,SOCK_STREAM,0);
    if(sock == -1)
        return -1;
    
    // 绑定地址
    struct sockaddr_un remote;
    remote.sun_family = AF_UNIX;
    strcpy(remote.sun_path,UNIX_PATH);
    
    // 连接
    if(connect(sock,(struct sockaddr*)&remote,sizeof(remote)) == -1)
    {
        close(sock);
        return -1;
    }

    // 通信
    while(1)
    {
        char buf[1024]={0};
        
        if(recv(sock,buf,1024,0) == -1&&(std::string(buf) == "exit"))
            break;
    
        std::cout << "来自其他进程的消息:" << buf << std::endl;
    }

    close(sock);
    return 0;
}

unix_send:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <cstring>
#include <unistd.h>

#define UNIX_PATH ("/home/thirteen/unix.socket")

int main()
{
    // 创建套接字
    int sock = socket(AF_UNIX,SOCK_STREAM,0);
    if(sock == -1)
        return -1;
    
    // 绑定地址
    struct sockaddr_un unix_infor;
    unix_infor.sun_family = AF_UNIX;
    strcpy(unix_infor.sun_path,UNIX_PATH);
    if(bind(sock,(struct sockaddr*)&unix_infor,sizeof(unix_infor)) == -1)
    {
        close(sock);
        return -1;
    }

    // 监听一下
    if(listen(sock,10) == -1)
    {
        close(sock);
        return -1;
    }

    // 等待连接
    int sock_s = -1;
    while(1)
    {
        struct sockaddr_un client;
        socklen_t client_size = sizeof(client);
        sock_s = accept(sock,(struct sockaddr*)&client,&client_size);
        if(sock_s != -1)
            break;
    }

    // 通信
    while(1)
    {
        char buf[1024]={0};
        std::cout << "请输入消息:";
        std::cin >> buf;
        
        send(sock_s,buf,strlen(buf),0);
        if(std::string(buf) == "exit")
            break;
    }

    close(sock_s);
    close(sock);
    return 0;
}

2、多路复用

多路复用:主要就是同时监听多个文件描述符是否就绪( readable / writeable / error )

阻塞IO

    • 没有数据可以读的时候,类似 read 的函数,会阻塞( wait )直到有数据可以读了,或者说 出错了。
    • 没有空间可以写的时候,类似 write 的函数,会阻塞,直到可以写或则是出错了,有空间就 写。

是内核默认一种 IO 方式,也是一种最简单的方式。

多路复用

  • select

  • select 的实现是在内核中开辟了一个内核线程去实现的
    • 同时监听,“ 轮询 ” :轮流询问 文件描述符
/* According to POSIX.1-2001, POSIX.1-2008 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>

int main()
{
    int fd = open("1.txt",O_RDWR);
    if(fd == -1)
        return -1;
    
    fd_set rfds;
    FD_SET(fd,&rfds);
    struct timeval tm;
    tm.tv_sec = 1;
    tm.tv_usec = 0;
    if(select(fd+1,&rfds,nullptr,nullptr,&tm) <= 0)
    {    
        close(fd);
        return -1;
    }

    if(FD_ISSET(fd,&rfds))
        std::cout << "可以读" << std::endl;
}
  • poll / epoll

    • poll 的功能和select类似,“ 监听多个文件描述符 ” 是否就绪,只不过 poll 用一个结构体 struct pollfd 来描述发 " 监听请求 "
    • 监听一个文件描述符,就需要一个 struct pollfd 结构体,监听多个文件描述符就需要多个 struct pollfd 结构体
    • #include <sys/poll.h>
      #include <unistd.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <iostream>
      
      int main()
      {
          int fd = open("1.txt",O_RDWR);
          if(fd == -1)
              return -1;
      
          struct pollfd rfds[1];
          rfds[0].events = POLLIN|POLLOUT; // 读事件
          rfds[0].fd     = fd; // 需要监听的文件描述符
      
          struct timeval tm;
          tm.tv_sec  = 1;
          tm.tv_usec = 0;
          if(poll(rfds,1,1) <= 0)
          {
              close(fd);
              return -1;
          }
      
          if(rfds[0].revents & POLLIN)
          {
              std::cout << "读就绪" << std::endl;
          }
          else
               std::cout << "读未就绪" << std::endl;
      
          close(fd);    
      }

    • epoll_create :创建一个监听文件的集合
    • epoll_ctl :设置监听事件
    • epoll_wait : 用来等待监听事件的发生的

epoll 相对而言在文件描述符很多的情况下,效率要比 select 和 poll 要高

epoll 支持ET

epoll 和 poll 和 select 的区别, epoll 不会去检测无意义的文件描述符

#include <sys/epoll.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>

int main()
{
    int fd = open("epoll.cpp",O_RDWR);
    if(fd == -1)
        return -1;

    int epoll = epoll_create(1);
    if(epoll == -1)
    {
        close(fd);
        return -1;
    }
    std::cout << "epoll创建成功" <<std::endl;

    struct epoll_event event;
    event.events = EPOLLIN | EPOLLOUT;
    // event.data.fd = fd;

    
    if(epoll_ctl(epoll,EPOLL_CTL_ADD,fd,&event) == -1)
    {
        perror("设置出错了");
        close(fd);
        return -1;
    }

    std::cout << "epoll设置成功" <<std::endl;
    struct epoll_event events={0};
    if(epoll_wait(epoll,&events,1,1000) == 0)
    {
        close(fd);
        return -1;
    }
    else
    {

    }

    if(events.events & EPOLLIN)
        std::cout << "读就绪" << std::endl;
    else
        std::cout << "读未就绪" << std::endl;    
}

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

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

相关文章

Spring理论知识(Ⅰ)——Spring分层结构,Spring模块数据访问与继承

1. Spring是什么&#xff1f; Spring是于2003 年兴起的一个轻量级的Java开发框架&#xff0c;由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层…

C和C++实现互调的方法

先解释一下C和C为什么不能直接互相调用&#xff1a; C支持函数重载&#xff0c;所以在编译的时候&#xff0c;函数名会发生变化。C语言不存在这个问题。那么在调用的时候&#xff0c;C找的是变化后的函数名&#xff0c;而C语言找的是原始的函数名。所以两者不能直接调用。 举个…

浅析KHD-厨帽检测算法从源码到实际应用的方案

厨帽检测算法&#xff0c;作为计算机视觉技术在食品安全领域的一项重要应用&#xff0c;其实际应用过程涉及多个方面。 厨帽检测算法主要基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;和目标检测框架&#xff08;如YOLO、Faster RCNN等&#xff…

部署webdav工具alist

1、下载部署包&#xff08;根据自己的环境下载对应包&#xff09; #进到指定目录下 cd /usr/local #下载部署包 wget https://github.com/alist-org/alist/releases/download/v3.35.0/alist-linux-arm64.tar.gz #加压包 tar zxf alist-linux-arm64.tar.gz2、进行部署安装 # 授…

海莲花活跃木马KSRAT加密通信分析

1.概述 自2023年8月至今&#xff0c;海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信&#xff0c;每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密&#xff0c;而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”…

Gaussian Splatting 在 Ubuntu22.04 下部署

代码:graphdeco-inria/gaussian-splatting (github) 论文:[2308.04079] 3D Gaussian Splatting for Real-Time Radiance Field Rendering (arxiv.org) 1. 禁用自带驱动 Nouveau Ubuntu 自带的显卡驱动,是非 Nvida 官方版。在后面装 CUDA 的时候,会报驱动不兼容问题。 1.…

浅析海思 3520DNVR源代码和网络硬盘录像机NVR全套源码方案

通过海思3520D实现NVR&#xff08;网络视频录像机&#xff09;芯片方案及硬盘录像机的算法功能&#xff0c;主要依赖于海思3520D芯片的强大性能和丰富的功能特性。 基于海思3520D芯片的NVR芯片方案&#xff0c;主要实现了以下功能&#xff1a; 视频接入与存储&#xff1a; 支…

Ultrascale/+的SYSMON获取温度值

XADC与SYSMON SYSMON结构框图 参考电压 有两种形式提供参考电压&#xff1a;外部供电和内部供电。 源语结构 温度计算 SYSMONE1 使用内部参考电压的话&#xff0c;计算公式如下&#xff1a; 通过ADC Code来计算温度的公式&#xff1a; 通过温度来计算ADC Code的公式&#x…

微信支付-h5、jsapi、native

1、微信支付-h5&#xff1a;适用于非微信客户端的浏览器微信支付&#xff1b; 2、微信支付-jsapi&#xff1a;适用于微信客户端的浏览器微信支付&#xff1b; 3、微信支付-native&#xff1a;适用于web端扫码支付。 服务商模式&#xff0c;相关配置如下&#xff1a; 1&…

设计模式(3)结构型模式

结构型模式 结构型模式1. Adapter&#xff08;适配器模式&#xff09;2. Bridge&#xff08;桥接模式&#xff09;3.Composite&#xff08;组合模式&#xff09;4.Decorator&#xff08;装饰模式&#xff09;5.Facade&#xff08;外观模式&#xff09;6.Flyweight&#xff08;享…

【html+css 绚丽Loading】 - 000010 三才定星轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

定制开发AI智能名片商城小程序:融合销售策略与个人魅力的营销新路径

摘要&#xff1a;在数字化时代&#xff0c;营销策略的创新与个性化成为企业脱颖而出的关键。本文探讨了如何通过定制开发AI智能名片商城小程序&#xff0c;结合销售策略与个人魅力&#xff0c;实现用户心甘情愿购买产品的目标。通过分析用户行为、心理需求及市场趋势&#xff0…

东方博宜OJ 训练计划:数学知识及编程应用 习题集

啊啊啊&#xff0c;好久没发过题解啦&#xff0c;望各位大佬 RP 食用OJ : 东方博宜 网站&#xff1a;东方博宜 第一部分&#xff1a;素数 这里想必大家都很了解了&#xff0c;就不详细介绍了 &#xff08;实在太累了&#xff09; 在C中&#xff0c;素数是一个只能被1和自身整…

Chrome浏览器 本地js代码替换(Overrides)以及多场景出现 浏览器响应慢、卡顿等情况——问题解决

前言&#xff1a;作为一名前端开发者&#xff0c;chorme 的本地代码替换功能可以说非常收益的。例如&#xff1a;某一前端的线上版本出现问题了&#xff0c;如果不想跑本地代码调试&#xff0c;只是想先通过Chrome线上改代码的方式来定位问题并尝试修复可以说是非常方便。但是&…

2024 Testing Expo即将开幕,怿星科技展品大剧透!

汽车行业万众瞩目的 汽车测试及质量监控博览会&#xff08;Testing Expo China – Automotive&#xff09; 即将在上海开幕&#xff01; 2024年8月28日至30日 上海世博展览馆H1馆 怿星科技诚邀您莅临展位&#xff08;展位号2057&#xff09;&#xff01; 怿星科技将展出哪…

二叉树中的奇偶树问题

目录 一题目&#xff1a; 二思路汇总&#xff1a; 1.二叉树层序遍历&#xff1a; 1.1题目介绍&#xff1a; 1.2 解答代码&#xff08;c版&#xff09;&#xff1a; 1.3 解答代码&#xff08;c版&#xff09;&#xff1a; 1.4 小结一下&#xff1a; 2.奇偶树分析&#xf…

【学习笔记】Matlab和python双语言的学习(一元线性回归模型)

文章目录 前言一、一元线性回归回归分析的一般步骤一元线性回归的基本形式回归方程参数的最小二乘法估计对回归方程的各种检验估计标准误差的计算回归直线的拟合优度判定系数显著性检验 二、示例三、代码实现----Matlab1.Matlab 的 regress 函数2.Matlab 代码 四、代码实现----…

我像只鱼儿在你的进程池~

我像只鱼儿在你的进程池&#xff5e; 只为你守候这进程间通信&#xff5e; 一点都不押韵 点踩吧 父进程是master&#xff0c;它提前创建出一堆紫禁城&#xff0c;如果有命令就交给子进程去执行&#xff08;和shell不一样&#xff0c;shell是有任务才去创建子进程&#xff09…

吹爆SyntaxFlow!数据流分析实战解析

正文开始前辟个谣先 最近有小伙伴来问闭源收费的事 牛牛郑重告知大家 目前还没有这个计划 请大家放心使用 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 样例解析在之前的SyntaxFlow教程中&#xff0c;我们已经看到了非常多的代码样例进行数据流分…

广东失业领取指南 记录自己的失业

1. 前言 坐标广州&#xff0c;七月底就被裁员领取n1解放了&#xff0c;趁着这次机会&#xff0c;也想着躺几个月后再去上班&#xff0c;现在工作也不好找&#xff0c;加上之前加班实在是消耗太大了。想着躺也不能干躺&#xff0c;去申请一下失业金每个月还有补贴用&#xff0c…