wangzhengquan
2021-02-03 758438289fc45829a8f6cef1b42afed0a1a8cb60
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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
/**
 * @file
 * 
 * @brief 发布订阅和请求应答的客户端
 *
 * @details 向BusService发布消息或者在BusService上订阅感兴趣的消息
 */
 
 
 
#ifndef __NET_MOD_SOCKET_H__
#define __NET_MOD_SOCKET_H__
 
#include "net_mod_socket.h"
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
 
 
 
 
/**
 * @brief 创建 net_mod_socket
 * @return net_mod_socket 句柄
 */
void * net_mod_socket_open();
 
/**
 * @brief 关闭 net_mod_socket
 */
void net_mod_socket_close(void *_sockt);
 
 
 
/**
 * @brief 绑定端口到socket, 如果不绑定则系统自动分配一个
 *
 * @param key 绑定的key值
 * @return 0是成功,其他值是失败的错误码
 */
int net_mod_socket_bind(void * _socket, int key);
 
/**
 * @brief 强制绑定端口到socket, 适用于程序非正常关闭的情况下,重启程序绑定原来还没释放的key
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_force_bind(void * _socket, int key);
 
/**
 * @brief 发送信息,发送完成才返回
 *
 * @param buf 消息存放的缓存地址
 * @param size 消息长度
 * @param param key 发送给谁
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_sendto(void *_socket, const void *buf, const int size, const int key);
 
/**
 * @brief  发送信息,在指定时间内没发送完成也返回。 
 *
 * @param buf 消息存放的缓存地址
 * @param size 消息长度
 * @param param key 发送给谁
 * @param sec 秒
 * @param nsec 纳秒
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_sendto_timeout(void *_socket, const void *buf, const int size, const int key, int sec, int nsec);
 
/**
 * @brief 发送信息,无论是否发送完成立刻返回。
 *
 * @param buf 消息存放的缓存地址
 * @param size 消息长度
 * @param param key 发送给谁
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_sendto_nowait(void *_socket, const void *buf, const int size, const int key);
 
/**
 * @brief 等待接收信息,直到有消息接受到才返回
 *
 * @param buf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param size 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * 
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvfrom(void *_socket, void **buf, int *size, int *key);
 
/**
 * @brief 等待接收信息,在指定的时间内即使没有接受到消息也要返回
 *
 * @param buf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param size 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @param sec 秒
 * @param nsec 纳秒
 * 
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvfrom_timeout(void *_socket, void **buf, int *size, int *key, int sec, int nsec);
 
/**
 * @brief 等待接收信息,直到有消息接受到才返回
 *
 * @param buf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param size 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * 
 * @return 0是成功,其他值是失败的错误码
 */
int net_mod_socket_recvfrom_nowait(void *_socket, void **buf, int *size, int *key);
 
 
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,一直等待完成
 *
 * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param recvsize 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @callback  void (*recv_callback_fn)(void **sendbuf, int *sendsize)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvandsend(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback);
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,在指定的时间内即使没有完成也返回
 *
 * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param recvsize 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @callback  void (*recv_callback_fn)(void **sendbuf, int *sendsize)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。
 *
 * @param sec 秒
 * @param nsec 纳秒
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvandsend_timeout(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback,
                                      int sec, int nsec ) ;
 
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,无论成功与否立刻返回
 *
 * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param recvsize 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @callback  void (*recv_callback_fn)(void **sendbuf, int *sendsize)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvandsend_nowait(void *_socket, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback) ;
 
 
 
/**
 * @brief 跨机器发送消息并接受返回的应答消息,直到发送完成才返回
 *
 * 向node_arr 中的所有网络节点发送请求消息,节点的返回信息汇总并存储在recv_arr中
 * @param node_arr 网络节点组, 
 * @param node_arr_len该数组长度.如果IP为空则为本地发送。
 * @param send_buf 发送的消息
 * @param send_size 该消息体的长度
 * @param recv_arr 返回的应答消息数组
 * @param recv_arr_size 返回的应答消息数组长度
 *
 * @return 成功发送的节点的个数
 *
 */
int net_mod_socket_sendandrecv(void *_sockt, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, 
  net_mod_recv_msg_t ** recv_arr, int *recv_arr_size) ;
 
 
/**
 * @brief 跨机器发送消息并接受返回的应答消息,在指定时间内即使没有发送完成也返回
 *
 * 向node_arr 中的所有网络节点发送请求消息,节点的返回信息汇总并存储在recv_arr中
 * @param node_arr 网络节点组, 
 * @param node_arr_len该数组长度.如果IP为空则为本地发送。
 * @param send_buf 发送的消息
 * @param send_size 该消息体的长度
 * @param recv_arr 返回的应答消息数组
 * @param recv_arr_size 返回的应答消息数组长度
 * @param timeout 等待时间(豪秒,即千分之一秒)
 *
 * @return 成功发送的节点的个数
 *
 */
int net_mod_socket_sendandrecv_timeout(void *_sockt, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, 
  net_mod_recv_msg_t ** recv_arr, int *recv_arr_size, int timeout);
 
 
/**
 * @brief 跨机器发送消息并接受返回的应答消息,不管是否发送完成立刻返回
 *
 * 向node_arr 中的所有网络节点发送请求消息,节点的返回信息汇总并存储在recv_arr中
 * @param node_arr 网络节点组, 
 * @param node_arr_len该数组长度.如果IP为空则为本地发送。
 * @param send_buf 发送的消息
 * @param send_size 该消息体的长度
 * @param recv_arr 返回的应答消息数组
 * @param recv_arr_size 返回的应答消息数组长度
 *
 * @return 成功发送的节点的个数
 *
 */
int net_mod_socket_sendandrecv_nowait(void *_sockt, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, 
  net_mod_recv_msg_t ** recv_arr, int *recv_arr_size) ;
 
 
 
  /**
   * @brief 向node_arr中的所有网络节点发布消息
   *
   * @param node_arr 网络节点组, @node_arr_len该数组长度
   * @param topic 主题,
   * @param topic_size 该主题的长度
   * @param content 内容,
   * @param content_size 内容长度
   *
   * @return 成功发布的节点的个数
   */
int net_mod_socket_pub(void *_sockt, net_node_t *node_arr, int node_arr_len, char *topic, int topic_size, void *content, int content_size);
 
 
/**
  * @brief 向node_arr中的所有网络节点发布消息,在指定时间内即使没有发布完成也返回
  *
  * @param node_arr 网络节点组, @node_arr_len该数组长度
  * @param topic 主题,
  * @param topic_size 该主题的长度
  * @param content 内容,
  * @param content_size 内容长度
  * @param msec 超时时间(毫秒,既千分之一秒)
  *
  * @return 成功发布的节点的个数
  */
int net_mod_socket_pub_timeout(void *_sockt, net_node_t *node_arr, int node_arr_len, char *topic, int topic_size, void *content, int content_size, int msec);
 
 
/**
  * @brief 向node_arr中的所有网络节点发布消息,不管是否发布完成立刻返回
  *
  * @param node_arr 网络节点组, @node_arr_len该数组长度
  * @param topic 主题,
  * @param topic_size 该主题的长度
  * @param content 内容,
  * @param content_size 内容长度
  *
  * @return 成功发布的节点的个数
  */
int net_mod_socket_pub_nowait(void *_sockt, net_node_t *node_arr, int node_arr_len, char *topic, int topic_size, void *content, int content_size);
 
/**
 * @brief 订阅感兴趣主题的消息
 *
 * @param topic 主题
 * @param size 主题长度
 *
 * @return  0是成功,其他值是失败的错误码
 * 
 */
int  net_mod_socket_sub(void * _socket, void *topic, int size);
 
/**
 * @brief 订阅感兴趣主题的消息, 在指定的时间内即使未完成订阅也返回
 *
 * @param topic 主题
 * @param size 主题长度
 * @param sec 秒 
 * @param nsec 纳秒
 * 
 * @return  0是成功,其他值是失败的错误码
 */
int  net_mod_socket_sub_timeout(void * _socket, void *topic, int size,  int sec, int nsec);
 
 
/**
 * @brief 订阅感兴趣主题的消息,不管是否完成订阅立刻返回
 *
 * @param topic 主题
 * @param size 主题长度
 *
 * @return  0是成功,其他值是失败的错误码
 * 
 */
int  net_mod_socket_sub_nowait(void * _socket, void *topic, int size);
 
 
/**
 * @brief 取消订阅指定主题
 *
 * @param topic 主题,主题为空时取消全部订阅
 * @param size 主题长度
 *
 * @return  0是成功,其他值是失败的错误码
 */
int  net_mod_socket_desub(void * _socket, void *topic, int size);
 
 
/**
 * @brief 取消订阅指定主题,在指定时间内即使未完成取消订阅任务也返回
 *
 * @param topic 主题,主题为空时取消全部订阅
 * @param size 主题长度
 * @param sec 秒
 * @param nsec 纳秒
 *
 * @return  0是成功,其他值是失败的错误码
 */
int  net_mod_socket_desub_timeout(void * _socket, void *topic, int size, int sec, int nsec);
 
 
/**
 * @brief 取消订阅指定主题,不管是否完成取消订阅任务都要立刻返回
 *
 * @param topic 主题,主题为空时取消全部订阅
 * @param size 主题长度
 *
 * @return  0是成功,其他值是失败的错误码
 */
int  net_mod_socket_desub_nowait(void * _socket, void *topic, int size);
 
 
/**
 * @brief 获取soket的key
 * @return key
 */
int net_mod_socket_get_key(void * _socket) ;
 
 
/**
 * @brief 销毁sendandrecv方法返回的消息组 
 *
 * @param arr 消息组
 * @param size 消息组的长度
 */
void  net_mod_socket_free_recv_msg_arr(net_mod_recv_msg_t * arr, int size);
 
 
/**
 * @brief 释放存储接收信息的buf
 */
void net_mod_socket_free(void *buf) ;
 
 
/**
 * @brief 删除key对应的共享队列,并在bus里删除该key的订阅
 *
 * @return 删除的key的数量
 */
int shm_mod_socket_remove_key(int key);
 
/**
 * @brief 批量删除key对应的共享队列,并在bus里删除该key的订阅
 *
 * @return 删除的key的数量
 */
int shm_mod_socket_remove_keys(int keys[], int length);
 
#ifdef __cplusplus
}
#endif
 
#endif