acl  3.5.3.0
dns_service.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <list>
4 #include "../ipc/ipc_service.hpp"
5 #include "../stream/aio_handle.hpp"
6 #include "../stream/aio_delay_free.hpp"
7 #include "string.hpp"
8 
9 namespace acl
10 {
11 
13 {
14 public:
15  dns_res(const char* domain) : domain_(domain) {}
16  ~dns_res() { ips_.clear(); }
17 
18  string domain_;
19  std::list<string> ips_;
20 protected:
21 private:
22 };
23 
25 {
26 public:
27  dns_result_callback(const char* domain) : domain_(domain) {}
28 
29  /**
30  * 当任务处理完毕或出错时,内部处理过程会自动调用 destroy 接口,
31  * 子类可以在该接口内进行一些释放过程,尤其当该对象是动态创建时,
32  * 子类应该在该函数内 delete this 以删除自己,因为该函数最终肯定
33  * 会被调用,所以子类不应在其它地方进行析构操作
34  */
35  virtual void destroy(void) {}
36 
37  /**
38  * 子类实现此接口,以获得查询结果,如果 res.ips_.size() == 0
39  * 则说明查询结果为空
40  * @param domain {const char*} 用户输入的查询的域名
41  * @param res {const dns_res&} 查询结果集
42  * 注:在该回调中不得删除 dns_service 对象,否则将会造成
43  * 内存非法访问,因为该回调是在 dns_service 中被调用的,
44  * 在该函数返回后 dns_service 对象还会继续使用
45  */
46  virtual void on_result(const char* domain, const dns_res& res) = 0;
47 
48  /**
49  * 获得在构造函数中设置的域名值
50  */
51  const string& get_domain() const { return (domain_); }
52 protected:
53  virtual ~dns_result_callback() {}
54 private:
55  string domain_;
56 };
57 
58 class ipc_client;
59 
61  : public ipc_service
62  , public aio_delay_free
63 {
64 public:
65  /**
66  * 构造函数
67  * @param nthread {int} 如果该值 > 1 则内部自动采用线程池,否则
68  * 则是一个请求一个线程
69  * @param win32_gui {bool} 是否是窗口类的消息,如果是,则内部的
70  * 通讯模式自动设置为基于 _WIN32 的消息,否则依然采用通用的套接
71  * 口通讯方式
72  */
73  dns_service(int nthread = 1, bool win32_gui = false);
74  ~dns_service();
75 
76  /**
77  * 开始域名解析过程
78  * @param callback {dns_result_callback*} 当解析完毕后回调此类的
79  * 的回调函数 on_result
80  */
81  void lookup(dns_result_callback* callback);
82 
83  /**
84  * 当查询线程完成域名解析后会通知主线程的查询对象,该查询对象会
85  * 调用本回调函数通知主类查询结果
86  * @param res {const dns_res&} 查询结果集
87  */
88  void on_result(const dns_res& res);
89 protected:
90  /**
91  * 基类虚函数,当有新连接到达时基类回调此函数
92  * @param client {aio_socket_stream*} 接收到的新的客户端连接
93  */
94  virtual void on_accept(aio_socket_stream* client);
95 
96 #if defined(_WIN32) || defined(_WIN64)
97  /**
98  * 基类虚函数,当收到来自于子线程的 win32 消息时的回调函数
99  * @param hWnd {HWND} 窗口句柄
100  * @param msg {UINT} 用户自定义消息号
101  * @param wParam {WPARAM} 参数
102  * @param lParam {LPARAM} 参数
103  */
104  virtual void win32_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
105 #endif
106 private:
107  std::list<dns_result_callback*> callbacks_;
108 };
109 
110 }
dns_result_callback(const char *domain)
Definition: dns_service.hpp:27
dns_res(const char *domain)
Definition: dns_service.hpp:15
string domain_
Definition: dns_service.hpp:18
std::list< string > ips_
Definition: dns_service.hpp:19
virtual void destroy(void)
Definition: dns_service.hpp:35
const string & get_domain() const
Definition: dns_service.hpp:51
#define ACL_CPP_API