当前位置:首页 > CN2资讯 > 正文内容

windows服务器 es部署 e+服务器

11小时前CN2资讯


在上一天,我们已经完整地开发了一个echo服务器,并且引入面向对象编程的思想,初步封装了Socket、InetAddress和Epoll,大大精简了主程序,隐藏了底层语言实现细节、增加了可读性。

让我们来回顾一下我们是如何使用epoll:将一个文件描述符添加到epoll红黑树,当该文件描述符上有事件发生时,拿到它、处理事件,这样我们每次只能拿到一个文件描述符,也就是一个int类型的整型值。试想,如果一个服务器同时提供不同的服务,如HTTP、FTP等,那么就算文件描述符上发生的事件都是可读事件,不同的连接类型也将决定不同的处理逻辑,仅仅通过一个文件描述符来区分显然会很麻烦,我们更加希望拿到关于这个文件描述符更多的信息。

在day03介绍epoll时,曾讲过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 events */ epoll_data_t data; /* User data variable */ } __EPOLL_PACKED;

可以看到,epoll中的data其实是一个union类型,可以储存一个指针。而通过指针,理论上我们可以指向任何一个地址块的内容,可以是一个类的对象,这样就可以将一个文件描述符封装成一个Channel类,一个Channel类自始至终只负责一个文件描述符,对不同的服务、不同的事件类型,都可以在类中进行不同的处理,而不是仅仅拿到一个int类型的文件描述符。

这里读者务必先了解C++中的union类型,在《C++ Primer(第五版)》第十九章第六节有详细说明。

Channel类的核心成员如下:

class Channel{ private: Epoll *ep; int fd; uint32_t events; uint32_t revents; bool inEpoll; };

显然每个文件描述符会被分发到一个Epoll类,用一个ep指针来指向。类中还有这个Channel负责的文件描述符。另外是两个事件变量,events表示希望监听这个文件描述符的哪些事件,因为不同事件的处理方式不一样。revents表示在epoll返回该Channel时文件描述符正在发生的事件。inEpoll表示当前Channel是否已经在epoll红黑树中,为了注册Channel的时候方便区分使用EPOLL_CTL_ADD还是EPOLL_CTL_MOD。

接下来以Channel的方式使用epoll:
新建一个Channel时,必须说明该Channel与哪个epoll和fd绑定:

Channel *servChannel = new Channel(ep, serv_sock->getFd());

这时该Channel还没有被添加到epoll红黑树,因为events没有被设置,不会监听该Channel上的任何事件发生。如果我们希望监听该Channel上发生的读事件,需要调用一个enableReading函数:

servChannel->enableReading();

调用这个函数后,如Channel不在epoll红黑树中,则添加,否则直接更新Channel、打开允许读事件。enableReading函数如下:

void Channel::enableReading(){ events = EPOLLIN | EPOLLET; ep->updateChannel(this); }

可以看到该函数做了两件事,将要监听的事件events设置为读事件并采用ET模式,然后在ep指针指向的Epoll红黑树中更新该Channel,updateChannel函数的实现如下:

void Epoll::updateChannel(Channel *channel){ int fd = channel->getFd(); //拿到Channel的文件描述符 struct epoll_event ev; bzero(&ev, sizeof(ev)); ev.data.ptr = channel; ev.events = channel->getEvents(); //拿到Channel希望监听的事件 if(!channel->getInEpoll()){ errif(epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1, "epoll add error");//添加Channel中的fd到epoll channel->setInEpoll(); } else{ errif(epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ev) == -1, "epoll modify error");//已存在,则修改 } }

在使用时,我们可以通过Epoll类中的poll()函数获取当前有事件发生的Channel:

while(true){ vector<Channel*> activeChannels = ep->poll(); // activeChannels是所有有事件发生的Channel }

注:在今天教程的源代码中,并没有将事件处理改为使用Channel回调函数的方式,仍然使用了之前对文件描述符进行处理的方法,这是错误的,将在明天的教程中进行改写。

至此,day05的主要教程已经结束了,完整源代码请在code/day05文件夹。服务器的功能和昨天一样,添加了Channel类,可以让我们更加方便简单、多样化地处理epoll中发生的事件。同时脱离了底层,将epoll、文件描述符和事件进行了抽象,形成了事件分发的模型,这也是Reactor模式的核心,将在明天的教程进行讲解。

进入code/day05文件夹,使用make命令编译,将会得到server和client,输入命令./server开始运行服务器。然后在一个新终端输入命令./client运行客户端,可以看到服务器接收到了客户端的连接请求,并成功连接。再新开一个或多个终端,运行client,可以看到这些客户端也同时连接到了服务器。此时我们在任意一个client输入一条信息,服务器都显示并发送到该客户端。如使用control+c终止掉某个client,服务器回显示这个client已经断开连接,但其他client并不受影响。

完整源代码:https:///yuesong-feng/30dayMakeCppServer/tree/main/code/day05


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/23706.html

    分享给朋友:

    “windows服务器 es部署 e+服务器” 的相关文章

    如何在Ubuntu上安装BBR Plus以提高网络性能

    在谈论BBR Plus之前,我们得先来了解一下BBR。BBR即“Bottleneck Bandwidth and Round-trip time”的缩写,这是Google推出的一种拥塞控制算法,它被集成在最新的Linux内核中。它的核心理念在于通过更合理的方式来计算网络的瓶颈带宽和往返时间。这种算法...

    RackNerd VPS服务测评:性价比高、稳定性强的主机商推荐

    在当今的网络世界中,选择合适的主机商显得尤为重要。我最近体验了RackNerd这家提供VPS服务的主机商,想和大家分享一些我的观点。RackNerd因其性价比高而广受好评,这让我在决定购买前进行了详细的测评。我会从多个角度来探讨RackNerd的各方面表现。 RackNerd不仅在价格上拥有明显优势...

    Atlantic VPS:高性能、灵活性与安全性的理想选择

    什么是Atlantic VPS? Atlantic VPS由Atlantic.net提供,这是一家在VPS托管服务领域中的资深者,已经经营了近29年。创建之初,Atlantic.net就定位于高性能和灵活性,以满足企业和开发者日益增长的需求。他们的目标是提供一种可靠的解决方案,让用户在自己的业务上更...

    深度解析韩国makemodel:传统与现代结合的时尚理念

    markdown格式的内容 韩国makemodel概念 谈到韩国makemodel,我首先感受到了它所传递的深厚文化底蕴。这一时尚理念融合了传统与现代,不仅仅是对衣物的设计,更是一种对韩国文化的致敬。它通过巧妙的配搭,将历史悠久的韩服元素与现代流行趋势相结合,创造出一种独特的美学风格。每一件作品都像...

    购买DNS解锁服务器的最佳选择与配置指南

    在当今的信息时代,获取我们想要的内容常常并不像想象中那样简单。很多流媒体服务在不同地区的可用性有所限制,这使得我们在享受内容时常常受到阻碍。这时候,DNS解锁服务器就成为了解决这个问题的有效工具。DNS解锁技术通过修改服务器上的DNS设置,可以帮助用户突破地理限制,顺利访问各种国际流媒体服务。 我刚...

    优化RackNerd DC2机房 IP使用体验与性能评测

    我最近对RackNerd的DC2机房产生了越来越多的兴趣,特别是位于美国洛杉矶的这座机房。它被誉为RackNerd中中国国内访问速度较快的机房之一,吸引了很多需求高效网络连接的用户。这座机房的地理位置确实蛮不错,靠近美西主干线,对于需要与国内建立连接的网站和应用来说,能带来相对更快的访问速度。 对于...