1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
/*
* Copyright (c) 2014-2016, dennis wang
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @defgroup 管道引用 管道引用
* 管道引用
*
* <pre>
* kchannel_ref_t作为kchannel_t的包装器,对于用户透明化了管道的内部实现,同时提供了引用计数用于
* 管道的生命周期管理.
*
* 管道有3种类型:
*
* 1. 连接器
* 2. 监听器
* 3. 由监听器接受的新管道
*
* 管道有3种状态:
*
* 1. 新建立 刚建立但不确定是作为连接器或者监听器存在
* 2. 活跃 已经确定了自己的角色
* 3. 关闭 已经关闭,但还未销毁,引用计数不为零
*
* 在没有负载均衡器存在的情况下(kloop_t没有通过knet_loop_balancer_attach关联到kloop_balancer_t),
* 所有连接器管道都会在当前kloop_t内运行,所有由监听器接受的管道也会在kloop_t内运行.
* 如果kloop_t已经关联到负载均衡器,连接器/监听器接受的管道可能不在当前kloop_t内
* 运行,负载均衡器会根据活跃管道的数量将这个管道分配到其他kloop_t运行,或者仍然在当前kloop_t内运行,
* 结果取决于当前所有kloop_t负载的情况(活跃管道的数量).
*
* 可以调用函数knet_channel_ref_check_balance确定管道是否被负载均衡调配,调用knet_channel_ref_check_state
* 检查管道当前所处的状态,knet_channel_ref_close关闭管道,无论此时管道的引用计数是否为零,管道的套接字都会
* 被关闭,当管道引用计数为零时,kloop_t才会真正销毁它.调用knet_channel_ref_equal可以判断两个管道引用是否
* 指向同一个管道.
*
* 可以通过调用knet_channel_ref_set_timeout设置管道的读空闲超时(秒),这可以用做心跳包的处理,调用
* knet_channel_ref_connect时最后一个参数传递一个非零值可以设置连接器的连接超时(秒),这可以用于重连.
* 调用knet_channel_ref_get_socket_fd得到管道套接字,调用knet_channel_ref_get_uuid的到管道UUID.
* </pre>
* @{
*/
/**
* 增加管道引用计数,并创建与管道关联的新的kchannel_ref_t实例
*
* knet_channel_ref_share调用完成后,可以在当前线程内访问其他线程(kloop_t)内运行的管道
* @param channel_ref kchannel_ref_t实例
* @return kchannel_ref_t实例
*/
FuncExport kchannel_ref_t* ;
/**
* 减少管道引用计数,并销毁kchannel_ref_t实例
* @param channel_ref kchannel_ref_t实例
*/
FuncExport void ;
/**
* 将管道转换为监听管道
*
* 由这个监听管道接受的新连接将使用与监听管道相同的发送缓冲区最大数量限制和接受缓冲区长度限制,
* knet_channel_ref_accept所接受的新连接将被负载均衡,实际运行在哪个kloop_t内依赖于实际运行的情况
* @param channel_ref kchannel_ref_t实例
* @param ip IP
* @param port 端口
* @param backlog 等待队列上限(listen())
* @retval error_ok 成功
* @retval 其他 失败
*/
FuncExport int ;
/**
* 主动连接
*
* 调用knet_channel_ref_connect的管道会被负载均衡,实际运行在哪个kloop_t内依赖于实际运行的情况
* @param channel_ref kchannel_ref_t实例
* @param ip IP
* @param port 端口
* @param timeout 连接超时(秒)
* @retval error_ok 成功
* @retval 其他 失败
*/
FuncExport int ;
/**
* 重新发起连接
*
* <pre>
* 超时的管道将被关闭,建立新管道重连,新管道将使用原有管道的属性,包含回调函数和用户指针
* 如果timeout设置为0,则使用原有的连接超时,如果timeout>0则使用新的连接超时
* </pre>
* @param channel_ref kchannel_ref_t实例
* @param timeout 连接超时(秒)
* @retval error_ok 成功
* @retval 其他 失败
*/
FuncExport int ;
/**
* 设置管道自动重连
* <pre>
* auto_reconnect为非零值则开启自动重连,所有非错误性导致管道关闭,都会自动重连,用户手动调用
* knet_channel_ref_close将不会触发自动重连
* </pre>
* @param channel_ref kchannel_ref_t实例
* @param auto_reconnect 自动重连标志
*/
FuncExport void ;
/**
* 检查管道是否开启了自动重连
* @param channel_ref kchannel_ref_t实例
* @retval 0 未开启
* @retval 非零 开启
*/
FuncExport int ;
/**
* 检测管道是否是通过负载均衡关联到当前的kloop_t
* @param channel_ref kchannel_ref_t实例
* @retval 0 不是
* @retval 非0 是
*/
FuncExport int ;
/**
* 检测管道当前状态
* @param channel_ref kchannel_ref_t实例
* @param state 需要测试的状态
* @retval 1 是
* @retval 0 不是
*/
FuncExport int ;
/**
* 关闭管道
* @param channel_ref kchannel_ref_t实例
*/
FuncExport void ;
/**
* 检查管道是否已经关闭
* @param channel_ref kchannel_ref_t实例
* @retval 0 未关闭
* @retval 非零 关闭
*/
FuncExport int ;
/**
* 取得管道套接字
* @param channel_ref kchannel_ref_t实例
* @return 套接字
*/
FuncExport socket_t ;
/**
* 取得管道数据流
* @param channel_ref kchannel_ref_t实例
* @return kstream_t实例
*/
FuncExport kstream_t* ;
/**
* 取得管道所关联的事件循环
* @param channel_ref kchannel_ref_t实例
* @return kloop_t实例
*/
FuncExport kloop_t* ;
/**
* 设置管道事件回调
*
* 事件回调将在关联的kloop_t实例所在线程内被回调
* @param channel_ref kchannel_ref_t实例
* @param cb 回调函数
*/
FuncExport void ;
/**
* 设置管道空闲超时
*
* 管道空闲超时依赖读操作作为判断,在timeout间隔内未有可读数据既触发超时
* @param channel_ref kchannel_ref_t实例
* @param timeout 超时(秒)
*/
FuncExport void ;
/**
* 取得对端地址
* @param channel_ref kchannel_ref_t实例
* @return kaddress_t实例
*/
FuncExport kaddress_t* ;
/**
* 取得本地地址
* @param channel_ref kchannel_ref_t实例
* @return kaddress_t实例
*/
FuncExport kaddress_t* ;
/**
* 获取管道UUID
* @param channel_ref kchannel_t实例
* @return 管道UUID
*/
FuncExport uint64_t ;
/**
* 测试两个管道引用是否指向同一个管道
* @param a kchannel_t实例
* @param b kchannel_t实例
* @retval 0 不同
* @retval 非零 相同
*/
FuncExport int ;
/**
* 设置用户数据指针
* @param channel_ref kchannel_t实例
* @param ptr 用户数据指针
*/
FuncExport void ;
/**
* 获取用户数据指针
* @param channel_ref kchannel_t实例
* @return 用户数据指针
*/
FuncExport void* ;
/**
* 递增当前管道引用计数
* @param channel_ref kchannel_ref_t实例
* @return 当前引用计数
*/
FuncExport int ;
/**
* 递减当前管道引用计数
* @param channel_ref kchannel_ref_t实例
* @return 当前引用计数
*/
FuncExport int ;
/**
* 检测是否是IPV6管道
* @param channel_ref kchannel_ref_t实例
* @retvel 0 不是
* @retval 非0 是
*/
FuncExport int ;
/**
* 设置reuseport
* @param channel_ref kchannel_ref_t实例
* @retvel 0 不是
* @retval 非0 是
*/
FuncExport int ;
/** @} */
/* CHANNEL_REF_API_H */