acl  3.5.3.0
tcp_ipc.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../stdlib/noncopyable.hpp"
3 
4 namespace acl
5 {
6 
7 class tcp_manager;
8 class tcp_pool;
9 class string;
10 
11 /**
12  * 该类封装了 tcp_manager 管理类,可以动态添加目标服务端地址,同时动态创建与
13  * 每一个服务端的连接池
14  */
16 {
17 public:
18  tcp_ipc(void);
19  ~tcp_ipc(void);
20 
21  /**
22  * 设置与每个服务器所建连接池的最大连接限制
23  * @param max {int} 每个连接池的最大连接限制,当 <= 0 时则不限制连接数
24  * @return {tcp_ipc&}
25  */
26  tcp_ipc& set_limit(int max);
27 
28  /**
29  * 设置连接池中每个连接了空闲时间,当连接空闲时间超过设置值时将被关闭
30  * @param ttl {int} 空闲连接的最大超时时间
31  * @return {tcp_ipc&}
32  */
33  tcp_ipc& set_idle(int ttl);
34 
35  /**
36  * 设置每个连接的网络连接超时时间
37  * @param conn_timeout {int} 网络连接超时时间(秒)
38  * @return {tcp_ipc&}
39  */
40  tcp_ipc& set_conn_timeout(int conn_timeout);
41 
42  /**
43  * 设置每个连接的网络读写超时时间
44  * @param timeout {int} 读写超时时间(秒)
45  * @return {tcp_ipc&}
46  */
47  tcp_ipc& set_rw_timeout(int timeout);
48 
49  /**
50  * 获得 TCP 管理器对象
51  * @return {tcp_manager&}
52  */
53  tcp_manager& get_manager(void) const;
54 
55  /**
56  * 可以调用本方法显示添加一个服务器地址,只有当地址不存在时才会添加
57  * @param addr {const char*} 服务器地址,格式:IP:PORT
58  * @return {tcp_ipc&}
59  */
60  tcp_ipc& add_addr(const char* addr);
61 
62  /**
63  * 根据服务器地址删除指定的连接池对象,当连接池对象正在被引用时,该对象
64  * 不会被删除,而是采用延迟删除方式,当最后一个连接被归还后该连接池对象
65  * 才会被真正删除
66  * @param addr {const char*} 服务器地址,格式:IP:PORT
67  * @return {tcp_ipc&}
68  */
69  tcp_ipc& del_addr(const char* addr);
70 
71  /**
72  * 检测指定的服务器地址是否成功
73  * @param addr {const char*} 服务器地址,格式:IP:PORT
74  * @return {bool}
75  */
76  bool addr_exist(const char* addr);
77 
78  /**
79  * 获得当前所有的服务器地址集合
80  * @param addrs {std::vector<string>&} 存储结果集
81  */
82  void get_addrs(std::vector<string>& addrs);
83 
84  /**
85  * 向服务器发送指定长度的数据包
86  * @param addr {const char*} 指定的目标服务器地址
87  * @param data {const void*} 要发送的数据包地址
88  * @param len {unsigned int} 数据长度
89  * @param out {string*} 当该对象非 NULL 时表明需要从服务器读取响应数据,
90  * 响应结果将被存放在该缓冲区中,如果该对象为 NULL,则表示无需读取
91  * 服务器的响应数据
92  * @return {bool} 发送是否成功
93  */
94  bool send(const char* addr, const void* data, unsigned int len,
95  string* out = NULL);
96 
97  /**
98  * 向所有服务器发送数据包
99  * @param data {const void*} 要发送的数据包地址
100  * @param len {unsigned int} 数据长度
101  * @param exclusive {bool} 发送广播包时,是否加线程锁以防止其它线程
102  * 竞争内部连接池资源
103  * @param check_result {bool} 是否读服务器响应以证明服务器收到了数据
104  * @param nerr {unsigned *} 非 NULL 时存放失败的服务器的个数
105  * @return {size_t} 返回发送到的服务器的数量
106  */
107  size_t broadcast(const void* data, unsigned int len,
108  bool exclusive = true, bool check_result = false,
109  unsigned* nerr = NULL);
110 
111 private:
112  tcp_manager* manager_;
113  int max_;
114  int ttl_;
115  int conn_timeout_;
116  int rw_timeout_;
117 
118  bool send(tcp_pool&, const void*, unsigned int, string*);
119 };
120 
121 } // namespace acl
#define ACL_CPP_API