epoll基本模型案例实现

网络编程11——epoll实现多路IO的三个基本函数:epoll_create、epoll_ctl、epoll_wait 要用epoll实现多路IO转接需要用的epoll_create()、epoll_ctl()、epoll_wait()三个函数 一、epoll_create(int size):创建一棵监听红黑树 本质是一棵平衡二叉树(红黑树) 参数size:创建红黑树的监听节点数量(但这个数仅供内核参考 返回值:成功指向新创建的红黑树的根节点fd;失败返回-1和errno 二、epoll_ctrl:操作监听红黑树 参数1:epfd是epoll_create的函数返回值,就是图中的那个根节点 参数2:op 对该监听红黑 阅读详情

 这两天在看项目的数据结构定义及关系,遇到一些关于socket的知识点,还有一些C++的知识点,下面总结下:

1. struct epoll_event

    结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件,定义如下:

    typedef union epoll_data {
        void *ptr;
         int fd;
         __uint32_t u32;
         __uint64_t u64;
     } epoll_data_t;//保存触发事件的某个文件描述符相关的数据

     struct epoll_event {
         __uint32_t events;      /* epoll event */
         epoll_data_t data;      /* User data variable */
     };

    其中events表示感兴趣的事件和被触发的事件,可能的取值为:
    EPOLLIN :表示对应的文件描述符可以读;
    EPOLLOUT:表示对应的文件描述符可以写;
    EPOLLPRI: 表示对应的文件描述符有紧急的数可读;

    EPOLLERR:表示对应的文件描述符发生错误;
    EPOLLHUP:表示对应的文件描述符被挂断;
    EPOLLET:    ET的epoll工作模式;

    所涉及到的函数有:

1、epoll_create函数
     函数声明:int epoll_create(int size)
    功能:该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围;


2、epoll_ctl函数
     函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
     功能:用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
    @epfd:由 epoll_create 生成的epoll专用的文件描述符;
     @op:要进行的操作,EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 删除;
     @fd:关联的文件描述符;
    @event:指向epoll_event的指针;
    成功:0;失败:-1


3、epoll_wait函数
    函数声明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
    功能:该函数用于轮询I/O事件的发生;
    @epfd:由epoll_create 生成的epoll专用的文件描述符;
    @epoll_event:用于回传代处理事件的数组;
    @maxevents:每次能处理的事件数;
    @timeout:等待I/O事件发生的超时值;
    成功:返回发生的事件数;失败:-1

应用举例:

#define SERV_PORT 4466   //服务端口号
const char *LOCAL_ADDR = "127.0.0.1";//绑定服务地址

bool setnonblocking(int sock)//设置socket为非阻塞方式
{
    int opts;
    
    opts=fcntl(sock,F_GETFL);
    if(opts<0)
    {
        perror("fcntl(sock,GETFL)");
        return false;
    }
    opts = opts|O_NONBLOCK;
    if(fcntl(sock,F_SETFL,opts)<0)
    {
        perror("fcntl(sock,SETFL,opts)");
        return false;
    }
    return true;
}

int main()
{
  int i, maxi, listenfd, new_fd, sockfd,epfd,nfds;
  ssize_t n;
  char line[MAXLINE];
  socklen_t clilen;
  struct epoll_event ev,events[20];//ev用于注册事件,数组用于回传要处理的事件
  struct sockaddr_in clientaddr, serveraddr;

  listenfd = socket(AF_INET, SOCK_STREAM, 0);//生成socket文件描述符
  setnonblocking(listenfd);//把socket设置为非阻塞方式
   
  epfd=epoll_create(256);//生成用于处理accept的epoll专用的文件描述符
  ev.data.fd=listenfd;//设置与要处理的事件相关的文件描述符
  ev.events=EPOLLIN|EPOLLET;//设置要处理的事件类型
  epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);//注册epoll事件

       //设置服务器端地址信息
  bzero(&serveraddr, sizeof(serveraddr));
  serveraddr.sin_family = AF_INET;
  char *local_addr= LOCAL_ADDR;
  inet_aton(local_addr,&(serveraddr.sin_addr));
  serveraddr.sin_port=htons(SERV_PORT);

  bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));//绑定socket连接
  listen(listenfd, LISTENQ);//监听

  maxi = 0;
  for ( ; ; ) 
      {
         /* epoll_wait:等待epoll事件的发生,并将发生的sokct fd和事件类型放入到events数组中;
          * nfds:为发生的事件的个数。
          * 注:事件发生后,注册在epfd上的socket fd的事件类型会被清空,所以如果下一个循环你
         * 还要关注这个socket fd的话,则需要用epoll_ctl(epfd,EPOLL_CTL_MOD,listenfd,&ev)来
         * 重新设置socket fd的事件类型
         */
      nfds=epoll_wait(epfd,events,20,500);

      //处理所发生的所有事件
      for(i=0;i<nfds;++i)
      {
          if(events[i].data.fd==listenfd)//事件发生在listenfd上
          {
                    /* 获取发生事件端口信息,存于clientaddr中;
                   * new_fd:返回的新的socket描述符,用它来对该事件进行recv/send操作*/
              new_fd = accept(listenfd,(struct sockaddr *)&clientaddr, &clilen);
              if(connfd<0)
                   {
                  perror("connfd<0");
                  exit(1);
              }
              setnonblocking(connfd);
              char *str = inet_ntoa(clientaddr.sin_addr);
              ev.data.fd=connfd;//设置用于读操作的文件描述符
              ev.events=EPOLLIN|EPOLLET;//设置用于注测的读操作事件
              epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);//注册ev
          }
          else if(events[i].events&EPOLLIN)
          {
              if ( (sockfd = events[i].data.fd) < 0) 
                       continue;

              if ( (n = read(sockfd, line, MAXLINE)) < 0) 
                   {
                  if (errno == ECONNRESET) 
                      {
                      close(sockfd);
                      events[i].data.fd = -1;
                  }
                      else
                      std::cout<<"readline error"<<std::endl;
              } 
                  else if (n == 0) 
                  {
                  close(sockfd);
                  events[i].data.fd = -1;
             }
             ev.data.fd=sockfd;//设置用于写操作的文件描述符
             ev.events=EPOLLOUT|EPOLLET;//设置用于注测的写操作事件
             epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);//修改sockfd上要处理的事件为EPOLLOUT
        }
       else if(events[i].events&EPOLLOUT)
       {
           sockfd = events[i].data.fd;
            write(sockfd, line, n);
  
            ev.data.fd=sockfd;//设置用于读操作的文件描述符
            ev.events=EPOLLIN|EPOLLET;//设置用于注测的读操作事件
            epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);//修改sockfd上要处理的事件为EPOLIN
       }
   }
 }
}

linux epoll模型源码分析 一 函数实现 本文基于2.6.39内核 第一部分已经大致的介绍了linux在实现EPOLL模型所用到的主要数据结构,接下来这篇就是主要分析怎样通过这些数据结构来实现EPOLL的功能。 一。模块的加载 linux把EPOLL当做一个模块,模块入口函数的代码如下: 阅读详情

相关推荐

VLA模型(具身智能入门十)

Vision Language Action(VLA)模型VLA模型是机器人领域的“感知-理解-执行”一体化框架,通过Transformer架构融合视觉、语言、动作模态,核心目标是让机器人在自然语言驱动下,自主完成复杂操控任务。其定义的核心在于“跨模态统一”与“具象化行动”——不仅能“看懂”“听懂”,更能“做出正确的动作”,是实现通用机器人智能的关键方向。提供通用序列建模骨架,让视觉、语言、动作能以“序列”形式统一处理;ViT将视觉输入转换为序列特征,提供“看”的能力;LLMs。

weixin_39699362的博客 9931

struct epoll_event

转载自:http://hi.baidu.com/jj_wj/blog/item/4da7c7ca013a1e14be09e693.html 这两天在看项目的数据结构定义及关系,遇到一些关于socket的知识点,还有一些C++的知识点,下面总结下: 1. struct epol

坚持、专注 6049

电力现货市场出清机制与节点电价计算实战解析

本文深入解析了电力现货市场的出清机制,特别是节点边际电价的计算原理与实战应用。通过一个基于Matlab和IEEE30节点系统的完整案例,详细演示了如何利用最优潮流模型求解市场出清价格,并提取节点电价,揭示了电网阻塞如何影响实时电价的形成。

weixin_29061425的博客 950

关于Epoll的epoll_event.data的使用

epoll_event.data的使用

m0_56271386的博客 970

【板栗糖GIS】新装ArcGIS必调的12个隐藏设置——【效率翻倍指南】

本文详细介绍了新装ArcGIS后必调的12个隐藏设置,涵盖性能优化、路径管理、显示调校、工作流定制等方面,帮助用户显著提升GIS工作效率。从关闭后台地理处理到启用硬件加速,再到个性化快捷键配置,这些实用技巧能让ArcGIS运行更流畅,操作更便捷。

weixin_42524945的博客 546

共享单车数据分析与需求预测项目

除了自行车共享系统的有趣的实际应用之外,这些系统生成的数据特征使它们成为研究的有吸引力的对象。由于这些系统在交通、环境和健康问题中的重要作用,它们引起了极大的关注。Huber 回归器:一个对异常值具有鲁棒性的模型,CV 得分为 0.4660,表明它对此数据集可能不那么有效。代码中的内容cv_score就像您正在使用的机器学习模型的成绩单。它告诉您模型的表现如何。减少异常值的影响:它还可以减少异常值的影响,因为对数转换显着缩小了数据的范围。因此,cv_score平均分数表明您的模型的预测效果如何。

极光喵的博客 2948

前端 详解epoll_events结构体

Epoll 作为一种 IO 复用机制多应用与高并发领域,网上有很多如何使用 epoll 的基础教程,但对于 epoll 中很重要的结构体 epoll_event 讲的都模棱两可,这篇文章将做深入解析 在解析之前,先回顾一下 epoll 的使用方法。 首先调用int epoll_create(int size);创建一个 epoll 调用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);为 epoll 注册事件(如果是新

木牛的博客 1万+

利用Solidworks2020将挖掘机装配体转换为URDF模型

利用Solidworks2020将挖掘机装配体转换为URDF模型一、下载sw_urdf_exporter插件 URDF(Universal Robot Description Format)——通用机器人描述格式,它是ROS里边使用的一种机器人的描述文件,包含的内容有:连杆、关节,运动学和动力学参数、可视化模型、碰撞检测模型等。 一、下载sw_urdf_exporter插件 ROS提供了SolidWorks转URDF的插件(下载链接)—sw2urdfSetup.exe,下载后点击安装,安装完成后就能在sol

weixin_48192326的博客 6103

epoll_event结构体

epoll_event结构体一般用在epoll机制中,其定义如下: struct epoll_event {   uint32_t events;   /* Epoll events */   epoll_data_t data;    /* User data variable */ } __attribute__ ((__packed__)); typedef union epoll_dat...

judgejames的博客 2万+

从一根USB线缆说起:深入浅出聊聊那些影响信号完整性和EMC性能的‘小细节’(双绞、屏蔽、360度搭接全解析)

本文深入探讨了USB线缆中影响信号完整性和EMC性能的关键细节,包括双绞线绞距、屏蔽层设计和360度搭接工艺。通过实验数据和实用技巧,揭示了这些‘小细节’如何显著影响高频信号质量和电磁兼容性,为工程师提供了从选购到系统设计的全面指南。

weixin_30824479的博客 440

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

本文介绍基于 Spring Boot AI 集成阿里云 OSS 与 DashScope 语音识别 API 的高效语音识别系统。该系统通过云端存储音频文件,解决传统本地存储的性能瓶颈与存储压力,支持同步 / 异步语音转文本,实现文件自动生命周期管理。文中详述技术选型、架构设计、核心代码实现(含前后端及配置)、部署流程,展现其高并发处理、可靠文件管理能力,适用于客服、教育等企业级场景,为语音识别应用提供实用解决方案。

博客 1537

epoll_event结构体定义

分别表示一个32位和64位的无符号整数。使用时,用户可以将自己需要的数据存放到这个字段中,当事件触发时,epoll系统调用会返回这个数据,以便用户处理事件。字段表示用户数据,它的类型是一个union,可以存放一个指针或文件描述符等数据。可以指向任何类型的用户数据,

qq_41413211的博客 3396

windsurf中出现无法Connecting to server的解决方案

本文主要介绍了windsurf中出现无法Connecting to server的解决方案,希望能对使用windsurf的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 6万+

SevenCat 封装的EPOLL 模型

Linux 2.6内核以后一个重要的属性就是Epoll模型。 #pragma once #include #include #include #include #include #include #include #include "log.h" #ifndef EPOLL_SIZE #d

Derry的专栏 1153

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入理解select、poll和epoll及区别

select poll epoll

Dayu_log的博客 720

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

socket通信之epoll模型

socket通信之epoll模型 综合select和poll的一些优缺点,Linux从内核2.6版本开始引入了更高效的epoll模型,本节我们来详细介绍epoll模型。 linux中并没有一个epoll函数,而是提供了三个以epoll开头的函数: epoll_create epoll_ctl epoll_wait 有关linux官方对epoll的解释可以参考man 7 epoll。 epoll_create epoll_create函数原型如下: #include <sys/epoll.h>

morris 3万+

对于Epoll编程基本模型的理解

烦

呵呵后 692

高级IO epoll模型

高级IO——epoll,epoll 的相关系统调用,epoll_create,epoll_ctl,epoll_wait,epoll底层原理,epoll模型简易代码。

2301_76293625的博客 1378

epoll模型的实现原理

一、epoll模型概念与比较 select、poll、epoll一样都是I/O多路复用技术。网络编程还有其他常用模型,如每连接一进程(PPC, 在Apache服务器中采用)、每连接一线程(TPC)。还有Windows中的IOCP select/pselect, poll/ppoll与epoll的比较: 1. 历史上,select最先出现,pselect是POSIX定义的psele

Roykuang的专栏 1538

网络编程中epoll模型

epoll的两种模式ET和LT模式水平触发: 高电平代表1​ 只要缓冲区中有数据, 就一直通知边缘触发: 电平有变化就代表1​ 缓冲区中有数据只会通知一次, 之后再有数据才会通知.(若是读数据的时候没有读完, 则剩余的数据不会再通知, 直到有新的数据到来)

m0_65948738的博客 1487

实现epoll事件的两种模型(ET/LT)、epoll反应堆模型

讲解EPOLL事件有两种模型Edge Triggered (ET) 和Level Triggered (LT) ,并通过实例代码来实现讲解。讲解epoll反应堆模型(epoll ET模式 + 非阻塞 + void *ptr)。

caiji0169的博客 1564

epoll的基本使用

1. 网络编程中的四种IO模型 阻塞IO模型,默认socket都是阻塞的,就是IO操作都要等待操作完成以后才能返回; 非阻塞IO模型,就是IO操作时不等待,立即返回,但需要不断的去询问内核,数据是否准备好了,如果准备好了,就主动调用函数去处理数据,使用fcntl设置socket为非阻塞; 多路复用模型,就是事件驱动IO,也就是说检测到描述符上发生了事件,才去处理,典型的就是select和epol...

cpp加油站的专栏 454

epoll基本使用

epoll简介 epoll是Linux中的一种使用IO多路复用机制,即使用单个线程就可以监听多个文件描述符的读写事件,避免开启大量线程或者执行大量轮询的造成的不必要的性能开销。类似的机制还有select和poll,关于其区别参考。 高性能IO模型分析-浅析Select、Poll、Epoll机制(三) - 知乎 (zhihu.com) 头文件和API #include <sys/epoll.h> // 创建epoll,通常使用epoll_create即可,epoll_create1可以设置一些

j5856004的博客 1797

高级IO之epoll模型

日拱一卒,功不唐捐!一起进步~

qq_68926231的博客 1304

【Linux】【进程】epoll内核实现

8.在**回到ep_insert()**函数中。ep_item_poll()调用完成之后,会将epitem中的fllink字段添加到struct file中的f_ep_links链表中,这样就可以通过struct file找到所有对应的struct epollitem对象,进而通过struct epollitem找到所有的epoll实例对应的struct eventpoll。6.ep_insert()函数中,首先判断epoll实例中监视的文件数量是否已超过限制,没问题则为待添加的文件。

m0_64014551的博客 1344

epoll实现Reactor模式

在简单介绍epoll api之后,本文使用epoll实现Reactor模型,创建回射服务器

大草的博客 961
上一篇: getsockopt和setsockopt介绍
下一篇: 服务器端开发的一些建议
ctreewang
博客等级 码龄16年 1608粉丝 276原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值