当前位置: 首页 > news >正文

上传自己做的网站吗关键词优化百家号

上传自己做的网站吗,关键词优化百家号,qq推广群号码大全,做起点说网站的服务器多少钱仿muduo库实现并发服务器 1.Poller模块成员变量创建epoll模型对于一个描述符添加或修改事件监控对于一个描述符移除事件监控启动epoll事件监控,获取所有活跃连接 1.Poller模块 Poller模块主要是对任意的描述符进行IO事件监控。 它是对epoll的封装,可以让…

仿muduo库实现并发服务器

  • 1.Poller模块
    • 成员变量
    • 创建epoll模型
    • 对于一个描述符添加或修改事件监控
    • 对于一个描述符移除事件监控
    • 启动epoll事件监控,获取所有活跃连接

1.Poller模块

Poller模块主要是对任意的描述符进行IO事件监控。
它是对epoll的封装,可以让对描述符进行事件监控的操作更加简单。

它与Channel的关系:
一旦有活跃事件了,只有获取到这个连接的Channel对象,才能知道该连接要监控的事件是什么,知道事件就绪如何去处理。

主要的流程:
1.对描述符进行监控,但是要注意监控的对象是channel对象,因为只有channel对象才能找到该描述符要监控什么事件。
2.当描述符就绪时,通过描述符映射找到channel对象(通过hash找到channel对象),因为只有找到channel对象,才能知道就绪的事件如何处理。所以当描述符就绪时,就返回对应的channel对象。

成员变量

private:int _epfd;                                   // 用来标识epoll模型struct epoll_event _evs[DEFALUTMAX];         // 用来保存所有就绪的事件信息,信息1:就绪的描述符fd是谁。信息2:就绪的事件是什么std::unordered_map<int, Channel *> _channel; // 用来保存所有要监控的描述符信    

1.poller是封装epoll对描述符进行操作,所以一定要有一个epoll句柄。
2.当事件就绪时,就绪的事件信息就会保存在struct epoll_event 结构体数据中,保存的信息有就绪的描述符fd,就绪的事件。
3.poller是用来监控管理所有要监控的描述符,所以需要一个容器保存所有监控的描述符。
而poller监控的对象是channel,所以使用hash通过描述符映射对应的channel。这样就可以保存管理所有监控的描述符对象。

创建epoll模型

创建epoll模型,使用epoll_create()接口,返回值就是对应的epoll句柄。

// 创建epoll模型Poller(){_epfd = epoll_create(DEFALUTMAX); // 创建一个epoll模型if (_epfd < 0){ERRLog("epoll create failed");abort(); // 这个出错了就直接退出}}

对于一个描述符添加或修改事件监控

对描述符进行添加或修改事件监控,需要使用的接口是epoll_ctl(),不过这里对epoll_ctl()的操作先封装起来,外部直接调用这个封装好的epoll_ctl接口

要想对一个描述符添加事件监控,首先需要知道该描述符的fd,要监控的事件是什么,要进行操作是什么等细节。而描述符的fd,以及要监控的事件是什么都在channel对象里,所以传入一个channel对象,以及所需要进行操作即可。

不过在对一个连接真正添加和修改或者移除事件之前,还是需要判断一个该连接是否已经被添加到内核里面去了,如果已经被添加进去了,那么要进行的操作就是更新修改了,就不是添加了。所以我们还需要封装一个判定是否已经设置了监控的接口。
如何判断呢?就判断管理的哈希表中是否存在对于的channel对象即可。

 // 直接对epoll_ctl进行操作void Update(Channel *channel, int op){int fd = channel->Fd();//获取该channnel对应的描述符fdstruct epoll_event ev;ev.data.fd = fd;//设置要关系的fdev.events = channel->Events();//设置要关系的事件int ret = epoll_ctl(_epfd, op, fd, &ev);//对于一个描述符进行添加或修改事件监控if (ret < 0){ERRLog("epoll_ctl failed");}}// 判断一个连接channel是否设置了事件监控,就看_channel中是否有该连接bool HasChannel(Channel *channel){auto it = _channel.find(channel->Fd());if (it == _channel.end())return false; // 没找到return true;}

所以在内部封装了两个接口,对外真正提供的接口则是:

// 对于一个描述符添加或修改事件监控void UpdateEvent(Channel *channel){// 首先判断该连接是否已经被设置监控了,如果没有则添加监控,如果有则进行修改if (HasChannel(channel) == false){_channel.insert(std::make_pair(channel->Fd(), channel));//_channel[channel->Fd()]=channel;Update(channel, EPOLL_CTL_ADD);//}else{Update(channel, EPOLL_CTL_MOD);}}

对于一个描述符移除事件监控

对于描述符进行移除事件监控,主要有两个步骤:
1.从管理的hash表里移除(erase)
2.从红黑色树上移除(epoll_ctl,DEL)

 // 对于一个描述符移除事件监控void RemoveEvent(Channel *channel){auto it = _channel.find(channel->Fd());//在哈希表中找到该channel对象if (it != _channel.end()){_channel.erase(it);//从哈希表中删除该channnel对象}Update(channel, EPOLL_CTL_DEL);//从内核中删除该监控}

启动epoll事件监控,获取所有活跃连接

启动事件监控,就是epoll进行等待事件就绪。
当有事件就绪时,epoll就不再等待,就会返回,并将就绪的信息带回来。
就绪的信息有哪个文件描述符的什么事件就绪了,光有这些信息是没有用的,因为对于描述符的channel对象不知道什么事件就绪啊,只有channel对象才能知道就绪后该怎么操作。所以需要将该描述符的什么事件就绪信息设置进对应的channel对象中(通过描述符在哈希表中映射找到channel对象),这样channel对象才能知道它就绪了什么事件,并且可以进行对应的处理,
所以我们可以通过一个vector数组,将所有就绪的channel对象全部存储起来。
供外层eventloop取出,全部依次执行对应的操作。
操作:
1.epoll进行等待监控
2.epoll返回,将就绪的信息设置到对应的channel对象中
3.保存所有就绪的channel对象。
通过一个输出型参数将数据带出来。

 // 开始监控,并返回所有活跃连接void Poll(std::vector<Channel *> *active){int nfds = epoll_wait(_epfd, _evs, DEFALUTMAX, -1); // 默认为阻塞等待if (nfds < 0){if (errno == EINTR){return;}ERRLog("epoll wait failed:%s\n", strerror(errno));abort();}for (int i = 0; i < nfds; i++)//有事件就绪了{int fd = _evs[i].data.fd;                    // 活跃的fd是哪个、assert(_channel.find(fd) != _channel.end()); // 不能在管理的channel里找不到// 找到之后就将就绪的事件信息设置到对应的channel里_channel[fd]->SetRevents(_evs[i].events);active->push_back(_channel[fd]); // 将活跃的连接插入进去,保存起来}}
http://www.dtcms.com/a/512634.html

相关文章:

  • 连云港做网站公司校园网的规划与设计
  • DeepSeek-OCR:视觉压缩的革命性突破——当OCR遇上LLM的“降维打击“
  • 盐城网站开发市场做网站怎么去工信部缴费
  • ps做游戏网站伊宁网站建设优化
  • 【高等数学笔记-极限(7)】函数连续
  • !for_each_process 命令详解
  • 住房与城乡建设网站引流客户的最快方法是什么
  • 江西网站开发的公司wordpress插件看访问者数量
  • 10.21
  • SharedFlow和StateFlow的方案选择-屏幕旋转设计
  • ps做素材下载网站有哪些wordpress用什么框架
  • 网站建设除凡科外还有哪些wordpress主题 添加自定义菜单
  • 怎么做视频网站教程什么是网络营销报价
  • DMA直接存储器访问
  • 电话销售怎么做 网站临沂森拓网络科技有限公司
  • 在网上招标做兼职的网站建设网站装配式建筑楼房
  • 360°客户视图:MDM/CDP如何驱动实时个性化服务?
  • JavaScript 与 React 工程化实践对比
  • 【完整源码+数据集+部署教程】【天线&其他】建筑损毁程度检测评估系统源码&数据集全套:改进yolo11-Parc
  • 24991-53-5,Amine-PEG-Amine的化学结构与反应活性
  • Java:创建、读取或更新 Excel 文档
  • 广州免费建站找哪家网站企业备案资料
  • (二)Flutter插件之Android插件开发
  • 贵港seo关键词整站优化ps如何做psd模板下载网站
  • 雄安做网站优化的公司企业官方网站的作用
  • 中国建设行业峰会官方网站营销公司有哪些
  • 用wireshark进行手机app抓包教程-2025最新
  • 建设网站应注意什么河北提供网站建设公司电话
  • Ubuntu22.04-Cuda12.1 安装 Detectron2
  • STM32电池管理系统(BMS):电量统计原理与实现