acl  3.5.3.0
master_udp.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "master_base.hpp"
4 #include "../stdlib/thread_mutex.hpp"
5 
6 #ifndef ACL_CLIENT_ONLY
7 
8 struct ACL_VSTRING;
9 
10 namespace acl {
11 
13 {
14 public:
15  /**
16  * 开始运行,调用该函数是指该服务进程是在 acl_master 服务框架
17  * 控制之下运行,一般用于生产机状态
18  * @param argc {int} 从 main 中传递的第一个参数,表示参数个数
19  * @param argv {char**} 从 main 中传递的第二个参数
20  */
21  void run_daemon(int argc, char** argv);
22 
23  /**
24  * 在单独运行时的处理函数,用户可以调用此函数进行一些必要的调试工作
25  * @param addrs {const char*} 服务监听地址列表,格式:IP:PORT, IP:PORT...
26  * @param path {const char*} 配置文件全路径
27  * @param count {unsigned int} 循环服务的次数,达到此值后函数自动返回;
28  * 若该值为 0 则表示程序一直循环处理外来请求而不返回
29  * @return {bool} 监听是否成功
30  */
31  bool run_alone(const char* addrs, const char* path = NULL,
32  unsigned int count = 1);
33 
34 protected:
35  // 该类不能直接被实例化
36  master_udp();
37  virtual ~master_udp();
38 
39  /**
40  * 纯虚函数:当 UDP 流有数据可读时回调子类此函数,该方法在子线程中调用
41  * @param stream {socket_stream*}
42  */
43  virtual void on_read(socket_stream* stream) = 0;
44 
45  /**
46  * 当绑定 UDP 地址成功后回调此虚方法,该方法在子线程中被调用
47  */
48  virtual void proc_on_bind(socket_stream&) {}
49 
50  /**
51  * 当解绑 UDP 地址时回调此虚方法,该方法在子线程中被调用
52  */
53  virtual void proc_on_unbind(socket_stream&) {}
54 
55  /**
56  * 当线程初始化时该虚方法将被调用
57  */
58  virtual void thread_on_init(void) {}
59 
60  /**
61  * 获得本地监听的套接口流对象集合
62  * @return {const std::vector<socket_stream*>&}
63  */
64  const std::vector<socket_stream*>& get_sstreams() const
65  {
66  return sstreams_;
67  }
68 
69  /**
70  * 获得配置文件路径
71  * @return {const char*} 返回值为 NULL 表示没有设配置文件
72  */
73  const char* get_conf_path(void) const;
74 
75 public:
76  void lock(void);
77  void unlock(void);
78 
79 private:
80  std::vector<socket_stream*> sstreams_;
81  thread_mutex lock_;
82 
83  void run(int argc, char** argv);
84  void push_back(socket_stream* ss);
85  void remove(socket_stream* ss);
86 
87 private:
88  // 当接收到一个客户端连接时回调此函数
89  static void service_main(void*, ACL_VSTREAM*);
90 
91  // 当绑定地址成功后的回调函数
92  static void service_on_bind(void*, ACL_VSTREAM*);
93 
94  // 当解绑地址时的回调函数
95  static void service_on_unbind(void*, ACL_VSTREAM*);
96 
97  // 当进程切换用户身份后调用的回调函数
98  static void service_pre_jail(void*);
99 
100  // 当进程切换用户身份后调用的回调函数
101  static void service_init(void*);
102 
103  // 当进程退出时调用的回调函数
104  static void service_exit(void*);
105 
106  // 当线程启动时调用的回调函数
107  static void thread_init(void*);
108 
109  // 当进程收到 SIGHUP 信号后会回调本函数
110  static int service_on_sighup(void*, ACL_VSTRING*);
111 };
112 
113 } // namespace acl
114 
115 #endif // ACL_CLIENT_ONLY
virtual void proc_on_bind(socket_stream &)
Definition: master_udp.hpp:48
virtual void proc_on_unbind(socket_stream &)
Definition: master_udp.hpp:53
const std::vector< socket_stream * > & get_sstreams() const
Definition: master_udp.hpp:64
#define ACL_CPP_API
virtual void thread_on_init(void)
Definition: master_udp.hpp:58