2019-07-27 22:44:32 +08:00
|
|
|
|
#pragma once
|
2018-09-28 17:52:18 +08:00
|
|
|
|
#include "../stdlib/thread_mutex.hpp"
|
2017-06-02 14:47:24 +08:00
|
|
|
|
#include "../stream/aio_handle.hpp"
|
|
|
|
|
#include "../stream/aio_listen_stream.hpp"
|
|
|
|
|
#include "master_base.hpp"
|
2014-11-19 00:25:21 +08:00
|
|
|
|
|
2019-05-18 21:19:21 +08:00
|
|
|
|
#ifndef ACL_CLIENT_ONLY
|
|
|
|
|
|
2016-12-03 20:09:21 +08:00
|
|
|
|
struct ACL_VSTREAM;
|
2017-09-09 00:30:39 +08:00
|
|
|
|
struct ACL_VSTRING;
|
2016-12-03 20:09:21 +08:00
|
|
|
|
|
2014-11-19 00:25:21 +08:00
|
|
|
|
namespace acl {
|
|
|
|
|
|
|
|
|
|
class aio_handle;
|
|
|
|
|
class aio_socket_stream;
|
|
|
|
|
|
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* acl_master 服务器框架中单线程非阻塞方式的模板类,该类对象只能有一个实例运行
|
2014-11-19 00:25:21 +08:00
|
|
|
|
*/
|
2016-12-03 20:09:21 +08:00
|
|
|
|
class ACL_CPP_API master_aio : public master_base, public aio_accept_callback
|
2014-11-19 00:25:21 +08:00
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 开始运行,调用该函数是指该服务进程是在 acl_master 服务框架
|
|
|
|
|
* 控制之下运行,一般用于生产机状态
|
|
|
|
|
* @param argc {int} 从 main 中传递的第一个参数,表示参数个数
|
|
|
|
|
* @param argv {char**} 从 main 中传递的第二个参数
|
2014-11-19 00:25:21 +08:00
|
|
|
|
*/
|
|
|
|
|
void run_daemon(int argc, char** argv);
|
|
|
|
|
|
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 在单独运行时的处理函数,用户可以调用此函数进行一些必要的调试工作
|
|
|
|
|
* @param addrs {const char*} 服务监听地址列表,格式:IP:PORT, IP:PORT...
|
|
|
|
|
* @param path {const char*} 配置文件全路径
|
|
|
|
|
* @param ht {aio_handle_type} 事件引擎的类型
|
|
|
|
|
* @return {bool} 监听是否成功
|
2014-11-19 00:25:21 +08:00
|
|
|
|
*/
|
|
|
|
|
bool run_alone(const char* addrs, const char* path = NULL,
|
|
|
|
|
aio_handle_type ht = ENGINE_SELECT);
|
|
|
|
|
|
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 获得异步IO的事件引擎句柄,通过此句柄,用户可以设置定时器等功能
|
2014-11-19 00:25:21 +08:00
|
|
|
|
* @return {aio_handle*}
|
|
|
|
|
*/
|
|
|
|
|
aio_handle* get_handle() const;
|
|
|
|
|
|
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 在 run_alone 模式下,通知服务器框架关闭引擎,退出程序
|
2014-11-19 00:25:21 +08:00
|
|
|
|
*/
|
|
|
|
|
void stop();
|
2016-12-03 20:09:21 +08:00
|
|
|
|
|
2017-07-22 21:32:21 +08:00
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 获得配置文件路径
|
|
|
|
|
* @return {const char*} 返回值为 NULL 表示没有设配置文件
|
2017-07-22 21:32:21 +08:00
|
|
|
|
*/
|
|
|
|
|
const char* get_conf_path(void) const;
|
|
|
|
|
|
2014-11-19 00:25:21 +08:00
|
|
|
|
protected:
|
|
|
|
|
master_aio();
|
|
|
|
|
virtual ~master_aio();
|
|
|
|
|
|
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 纯虚函数:当接收到一个客户端连接时调用此函数
|
|
|
|
|
* @param stream {aio_socket_stream*} 新接收到的客户端异步流对象
|
|
|
|
|
* @return {bool} 该函数如果返回 false 则通知服务器框架不再接收
|
|
|
|
|
* 远程客户端连接,否则继续接收客户端连接
|
2014-11-19 00:25:21 +08:00
|
|
|
|
*/
|
|
|
|
|
virtual bool on_accept(aio_socket_stream* stream) = 0;
|
2016-12-03 20:09:21 +08:00
|
|
|
|
|
2014-11-19 00:25:21 +08:00
|
|
|
|
private:
|
2017-07-04 23:33:28 +08:00
|
|
|
|
aio_handle* handle_;
|
2014-11-19 00:25:21 +08:00
|
|
|
|
/**
|
2019-07-27 22:44:32 +08:00
|
|
|
|
* 基类 aio_accept_callback 的虚函数实现
|
|
|
|
|
* @param client {aio_socket_stream*} 异步客户端流
|
|
|
|
|
* @return {bool} 返回 true 以通知监听流继续监听
|
2014-11-19 00:25:21 +08:00
|
|
|
|
*/
|
|
|
|
|
virtual bool accept_callback(aio_socket_stream* client);
|
2016-12-03 20:09:21 +08:00
|
|
|
|
|
2018-09-28 17:52:18 +08:00
|
|
|
|
private:
|
|
|
|
|
thread_mutex lock_;
|
|
|
|
|
void push_back(server_socket* ss);
|
|
|
|
|
|
2014-11-19 00:25:21 +08:00
|
|
|
|
private:
|
2015-06-29 17:33:11 +08:00
|
|
|
|
#if defined(_WIN32) || defined(_WIN64)
|
2019-07-27 22:44:32 +08:00
|
|
|
|
// 当接收到一个客户端连接时回调此函数
|
2014-11-19 00:25:21 +08:00
|
|
|
|
static void service_main(SOCKET, void*);
|
|
|
|
|
#else
|
|
|
|
|
static void service_main(int, void*);
|
|
|
|
|
#endif
|
|
|
|
|
|
2019-07-27 22:44:32 +08:00
|
|
|
|
// 当监听一个服务地址时回调此函数
|
2017-07-04 23:33:28 +08:00
|
|
|
|
static void service_on_listen(void*, ACL_VSTREAM*);
|
2016-12-03 20:09:21 +08:00
|
|
|
|
|
2019-07-27 22:44:32 +08:00
|
|
|
|
// 当进程切换用户身份后调用的回调函数
|
2014-11-19 00:25:21 +08:00
|
|
|
|
static void service_pre_jail(void*);
|
|
|
|
|
|
2019-07-27 22:44:32 +08:00
|
|
|
|
// 当进程切换用户身份后调用的回调函数
|
2014-11-19 00:25:21 +08:00
|
|
|
|
static void service_init(void*);
|
|
|
|
|
|
2019-07-27 22:44:32 +08:00
|
|
|
|
// 当进程退出时调用的回调函数
|
2014-11-19 00:25:21 +08:00
|
|
|
|
static void service_exit(void*);
|
2017-07-04 23:33:28 +08:00
|
|
|
|
|
2019-07-27 22:44:32 +08:00
|
|
|
|
// 当进程收到 SIGHUP 信号后会回调本函数
|
2017-09-09 00:30:39 +08:00
|
|
|
|
static int service_on_sighup(void*, ACL_VSTRING*);
|
2014-11-19 00:25:21 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace acl
|
2019-05-18 21:19:21 +08:00
|
|
|
|
|
|
|
|
|
#endif // ACL_CLIENT_ONLY
|