Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

反应器(Reactor)模式大概流程: 1. 应用程序在反应器上注册具体事件处理器, 处理器提供内部句柄给反应器 2. 在注册之后,应用程序开始启动反应器事件循环。 反应器将通过select等待发生在句柄集上的就绪事件。 3. 当一个或多个句柄变成就绪状态时(比如某个socket读就绪了),反应器将通知注册的事件处理器。 4. 事件处理器处理就绪事件,完成用户请求。 反应器模式使用起来比较直观,当时它不能同时支持大量的客户端请求或者耗时过长的请求,因为它串行了所有的事件处理过程。而主动器模式在这方面做了改进。

主动器(Proactor)模式大概流程: 1. 应用程序需要定义一个异步执行的操作,例如,socket的异步读/写 2. 执行异步操作,异步事件处理器将异步请求交给操作系统就返回了,让操作系统去完成具体的操作,操作系统在完成操作之后,会将完成事件放入一个完成事件队列。 3. 异步时间分离器会检测完成事件,若检测到完成事件,则从完成事件队列中取出完成事件,并通知应用程序注册的完成事件处理函数去处理。

Reactor和Proactor模式的主要区别就是真正的操作(如读、写)是由谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而在Proactor模式中,应用程序不需要进行实际的读/写过程,操作系统会读取缓冲区和或者写入缓存去到真正的IO设备,应用程序只需要从缓冲区读取或者写入即可。在Proactor模式中,用户发起异步操作之后就返回了,让操作系统去处理请求,然后等着回调到完成事件函数中处理异步操作的结果。

asio异步链接的简单例子:

asio::io_service io_service;
tcp::socket socket(io_service);
boost::asio::async_connect(socket, server_address, connect_handler);
io_service.run();

第一行代码定义了一个asio的核心对象io_service, 所有的io object对象的初始化都要将这个io_service传入。

第二行创建了一个tcp::socket类型的io object对象,通过这个io object对象我们就可以发起异步操作了,在发起异步操作之后,调用io_service的run启动事件循环,等待异步事件的完成。

About

基于Boost::asio的一个简单的通信程序

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages