revolver基础库的结构图如下:
主要是三部分:reactor模块、关联组件模块、独立组件。
1.reactor
reactor模块主要是实现网络的分时复用设计的模块,可以在同一个线程模式下处理来自网络的读写事件、内部消息事件、定时器事件。以下是reactor的接口定义:
class CReactor
{
public:
....
void set_message_processor(IMessageProcessor* proc){msg_proc_ = proc;};
virtual int32_t open_reactor(uint32_t number_of_handlers) = 0;
virtual int32_t close_reactor() = 0;
virtual int32_t event_loop() = 0;
virtual int32_t stop_event_loop() = 0;
//事件操作
//添加一个事件的监听
virtual int32_t register_handler(CEventHandler *handler, uint32_t masks) = 0;
//删除一个事件的特定监听
virtual int32_t remove_handler(CEventHandler *handler, uint32_t masks) = 0;
//删除一个事件
virtual int32_t delete_handler(CEventHandler *handler, bool del_event_obj = false) = 0;
//定时器操作
//添加一个定时器
virtual uint32_t set_timer(CEventHandler *event_handler, const void *act, uint32_t delay) = 0;
//删除一个定时器
virtual uint32_t cancel_timer(uint32_t timer_id, const void **act) = 0;
protected:
IMessageProcessor* msg_proc_;
};
其中
msg_proc_是内部消息队列处理器。
reactor的核心函数是event_loop,event_loop是事件轮询函数,所有的分时复用在其中实现,流程伪代码为:
void event_loop()
{
....
//添加被监控的时间
add_event_to_select(...);
//设置SELECT堵塞时间
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = select_delay_ * 1000;
//进行SOCKET集合的事件扫描
int32_t count = ::select(max_fd, &read_set, &write_set, &expeption_set, &timeout);
if(count > 0) {
//进行SOCKET的事件处理
}
//扫描定时器
select_delay_ = timer_queue_.expire();
//扫描内部消息队列
if(msg_proc_ != NULL){
msg_proc_->processor();
}
...
}
event_loop最主要的工作就是扫描事件。
1.1 EventHandler
CEventHandler是处理reactor触发的事件的,当有事件到来,loop_event会找到对应的event handler进行触发,CEventHandler的事件分类枚举:
typedef enum EVENT_MASK
{
MASK_READ = (1 << 0),//读事件
MASK_WRITE = (1 << 1),//写事件
MASK_TIMEOUT = (1 << 2),//超时事件
MASK_EXCEPT = (1 << 3),//异常事件
}EVENT_MASK;
事件判断值采用2进制进位来表示,1个event_value是否是否是读事件
if(event_value & MASK_READ)
{
//进行读事件处理
}
CEventHandler类接口一般只需要继承实现以下几个接口:
public:
virtual int32_t handle_timeout(const void *act, uint32_t timer_id);//超时事件
virtual int32_t handle_input(BASE_HANDLER handle);//socket读事件
virtual int32_t handle_output(BASE_HANDLER handle);//socket写事件
virtual int32_t handle_close(BASE_HANDLER handle, ReactorMask close_mask);//socket关闭
virtual int32_t handle_exception(BASE_HANDLER handle);//socket异常
以上几个接口根据需要进行实现,例如:只需要实现一个定时器,只需要实现
handle_timeout接口。
1.2 queue
revolver的消息队列实现其实很简单,通过一个继承IMessageProcessor并设置到reactor当中进行消息监听。IMessageProcessor是个即插即用的接口。revolver的消息队列定义如下:
template<class T, int32_t CAPACITY>
class BaseQueue_T
{
public:
BaseQueue_T()
{
data_ = new T[CAPACITY];
rindex_ = 0;
windex_ = 0;
};
~BaseQueue_T()
{
delete []data_;
};
bool put(const T& element)
{
//像队列中PUT一个消息
return true;
};
bool get(T& element)
{
//从队列中get一下消息
return true;
};
private:
T* data_;
volatile int32_t rindex_;
volatile int32_t windex_;
}
其中rindex_是队列读取位置,windex_是队列写入位置。T表示的是所用的消息类型。
1.3 Socket
以上SOCKET模块的继承和调用关系,BaseSocket是SOCKET的基础封装,主要是实现些send recv等函数,SocketDgram是UDP Socket的实现,SocketStream是TCP Socket的实现。SocketConnector是TCP连接器,CSocketAcceptor是TCP接收器。具体的可以看对应的代码。值得一提的是windows下的UDP Socket的ICMP处理问题,在UDP Socket在在open函数中有下面一段代码:
#ifdef WIN32 //解决WINSOCK2 的UDP端口ICMP的问题
int32_t byte_retruned = 0;
bool new_be = false;
int32_t status = WSAIoctl(handler_, SIO_UDP_CONNRESET,
&new_be, sizeof(new_be), NULL, 0, (LPDWORD)&byte_retruned, NULL, NULL);
#endif
这段代码是为了解决WINDOWS下reactor接收不到ICMP信号的问题。
1.4定时器
revolver的定时器是个相对较复杂的模块,以后打算用专门的篇幅来介绍。
备注:WINDOWS下的revolver只能用来做调试和测试作用,不可以用来做单独的服务。可以用来做客户端的网络模型。
分享到:
相关推荐
固定大小的 LIFO 数据结构,可选择不重复。 它们感觉很像数组,但在索引等一些重要领域有所不同。 例如,这对于保存最近动作的历史非常有用。 用法 创建一个新的Revolver : r = Revolver.new(3) #=> #<Revolver> ...
它更像是一个框架,而不是一个完整的解决方案。 因此,自然而然地,手写一些 javascript 是随该领域而来的。 让我们开始吧! 安装 安装 Revolver 的推荐方法是使用 。 bower install revolver 它将为您解决 ...
引导网络的快速分割传播 ... 我们建议使用引导网络,该网络可以从任何数量的监督中提取潜在的任务表示形式,并端到端优化我们的体系结构以实现快速,准确的几次分割。 我们的方法无需进一步优化即可切换任务,并在获得
报亭左轮手枪互动式信息亭的chrome扩展程序。 此扩展程序会定期加载具有给定URL的新标签页,并提供各种选项来锁定Chrome,以防止用户逃脱浏览器,同时仍允许他们与加载的页面进行交互。 请注意,无法阻止用户表单...
左轮手枪动态更改所用BRSTM播放器的脚本该脚本主要用于Smash Custom Music,仅在此处发布以存档源代码。
blue_revolver
左轮手枪 这是一个连接到Virto Commerce开源电子商务API的Android应用。 它使用Kotlin编程语言实现。 参考API在此处 。 此应用将具有以下功能 浏览目录 获取产品详细信息(文本,图像) 获取新产品 ...
$ npm install react-native-revolver-view $ yarn add react-native-revolver-view 其他依赖项: $ npm install react-native-reanimated react-native-gesture-handler @react-native-community/masked-view ...
dm - tab revolver是一个最先进的选项卡切换器,允许您设置选择的选项卡的幻灯片 dm - tab revolver是一种状态 - - 艺术选项卡切换器,允许您设置您选择的选项卡的幻灯片。它是高度可定制的功能将满足您的个人需求...
语言:English (United States) 此扩展程序可以使您的分辨率保持完好无损。
抽象精品ppt模板blue_revolver022
chrome-左轮手枪插件 Chrome插件的前叉,可自动重新加载和切换标签页 在此处查看原始项目: :
语言:English 左轮手枪标签-Kangal版 使用“ Kangal”功能自动旋转打开的标签。 此版本特别为Yiğido制作。 每个小时的第58分钟,您可以显示一个有关Sivas或Kangal的网站。 会议纪要和网站可以自定义。...
这个扩展允许你保持你的决议完好无损,精美。 支持语言:English (United States)
左轮手枪webpack插件 Webpack插件,用于从目录列表解析相对路径。 信息 当使用require或import包含文件时,Webpack本身不支持更改文件的源目录。 该插件提供了指定Webpack在尝试解析相对路径之前应从中读取的目录...
var Revolver = require ( 'react-image-revolver' ) ; React . render ( Revolver ( { images : [ '/img1.jpg' , '/img2.gif' , '/img3.png' ] , // array of img urls interval : 1000 // cycle interval in ms...
语言:English 自动刷新salesforce仪表板,报告并通过打开的选项卡进行轮换。 由Abaav 自动刷新Salesforce仪表板,报告并在打开的选项卡中轮换
Cookie-revolver框架为J2EE Web应用程序提供了双重身份验证安全性,即“我知道的东西”(用户ID /密码)和“我拥有的东西”(加密的一次性cookie)。
安装$ npm install --save resolver-revolver 由于这非常通用,因此下面是一个示例,该示例NODE_ENV或系统环境解析NODE_ENV ,如果其他所有方法均失败,则将其设置为development的默认值。 如果您想尝试这些示例,请...
从Google获取信息。 一个简单的扩展,可以在单个选项卡中一一显示网站。 当您只想使用一个选项卡的chrome Cast时很有用。 例如,锁定您的计算机后,chrome投射功能将停止投射整个桌面,但将继续流式传输单个选项卡。...