fujuntang
2021-12-07 22cd4140502e67d32967160bee56375eaa285011
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
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
/**
 * @file
 * 
 * @brief 发布订阅和请求应答的客户端
 *
 * @details 向BusService发布消息或者在BusService上订阅感兴趣的消息
 */
 
 
 
#ifndef __NET_MOD_SOCKET_H__
#define __NET_MOD_SOCKET_H__
 
#include "net_mod_socket.h"
#include "proc_def.h"
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
typedef void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data);
 
 
 
 
/**
 * @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 停止 net_mod_socket
 */
int net_mod_socket_stop(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);
 
int net_mod_socket_reg(void *_socket, void *pData, int len, void **buf, int *size, const int timeout_ms, int flag);
 
/**
 * @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, int reset = 0, int data_set = 0);
 
/**
 * @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, int reset = 0, int data_set = 0);
 
/**
 * @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, int reset = 0, int data_set = 0);
 
/**
 * @brief 等待接收信息,直到有消息接受到才返回
 *
 * @param buf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param size 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * 
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvfrom(void *_socket, void **buf, int *size, int *key, int reset = 0, int data_set = 0);
 
/**
 * @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, int reset = 0, int data_set = 0);
 
/**
 * @brief 等待接收信息,直到有消息接受到才返回
 *
 * @param buf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param size 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * 
 * @return 0是成功,其他值是失败的错误码
 */
int net_mod_socket_recvfrom_nowait(void *_socket, void **buf, int *size, int *key, int reset = 0, int data_set = 0);
 
void net_mod_socket_int_set(void * _socket, int data);
void net_mod_socket_svr_set(void * _socket, int data);
int net_mod_socket_int_get(void * _socket);
int net_mod_socket_svr_get(void * _socket);
void net_mod_socket_buf_data_set(void * _socket, std::string str, int val);
int net_mod_socket_buf_data_get(void * _socket, std::string str);
void net_mod_socket_buf_data_del(void * _socket, std::string str);
 
/**
 * @brief 跨机器发送消息并接受返回的应答消息,直到发送完成才返回
 *
 * 向node_arr 中的所有网络节点发送请求消息,节点的返回信息汇总并存储在recv_arr中
 * @param node_arr 网络节点组, 
 * @param node_arr_len该数组长度.如果IP为空则为本地发送。
 * @param send_buf 发送的消息
 * @param send_size 该消息体的长度
 * @param recv_arr 返回的应答消息数组,使用完后需要调用net_mod_socket_free_recv_msg_arr释放掉
 * @param recv_arr_size 返回的应答消息数组长度
 * @param err_arr 返回发送错误的节点数组,使用完后需要调用free方法释放掉
 × @param err_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,
  net_mod_err_t ** err_arr, int *err_arr_size) ;
 
 
/**
 * @brief 跨机器发送消息并接受返回的应答消息,在指定时间内即使没有发送完成也返回
 *
 * 向node_arr 中的所有网络节点发送请求消息,节点的返回信息汇总并存储在recv_arr中
 * @param node_arr 网络节点组, 
 * @param node_arr_len该数组长度.如果IP为空则为本地发送。
 * @param send_buf 发送的消息
 * @param send_size 该消息体的长度
 * @param recv_arr 返回的应答消息数组,使用完后需要调用net_mod_socket_free_recv_msg_arr释放掉
 * @param recv_arr_size 返回的应答消息数组长度
 * @param err_arr 返回发送错误的节点数组,使用完后需要调用free方法释放掉
 × @param err_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, 
  net_mod_err_t ** err_arr, int *err_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 返回的应答消息数组,使用完后需要调用net_mod_socket_free_recv_msg_arr释放掉
 * @param recv_arr_size 返回的应答消息数组长度
 * @param err_arr 返回发送错误的节点数组,使用完后需要调用free方法释放掉
 × @param err_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, 
  net_mod_err_t ** err_arr, int *err_arr_size) ;
 
 
 
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,一直等待完成
 *
 * @callback  void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data)
 *                  @recvbuf 收到的数据, 该recvbuf使用完成后需要手动释放
 *                  @recvsize 收到的数据的大小
 *                  @key 接受数据并发送数据的对象
 *                  @sendbuf 存储返回值的地址,表示返回的数据
 *                  @sendsize 存储返回值的地址, 返回数据的长度
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvandsend(void *_socket,  recvandsend_callback_wrapper_fn callback, void * user_data);
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,在指定的时间内即使没有完成也返回
 *
 * @callback  void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data)
 *                  @recvbuf 收到的数据, 该recvbuf使用完成后需要手动释放
 *                  @recvsize 收到的数据的大小
 *                  @key 接受数据并发送数据的对象
 *                  @sendbuf 存储返回值的地址,表示返回的数据
 *                  @sendsize 存储返回值的地址, 返回数据的长度
 *
 * @param sec 秒
 * @param nsec 纳秒
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvandsend_timeout(void *_socket, recvandsend_callback_wrapper_fn callback,
                                       int sec, int nsec, void * user_data ) ;
 
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,无论成功与否立刻返回
 *
 * @callback  void (*recvandsend_callback_wrapper_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data)
 *                  @recvbuf 收到的数据, 该recvbuf使用完成后需要手动释放
 *                  @recvsize 收到的数据的大小
 *                  @key 接受数据并发送数据的对象
 *                  @sendbuf 存储返回值的地址,表示返回的数据
 *                  @sendsize 存储返回值的地址, 返回数据的长度
 *
 * @return 0是成功, 其他值是失败的错误码
 */
int net_mod_socket_recvandsend_nowait(void *_socket, recvandsend_callback_wrapper_fn callback, void * user_data) ;
 
 
 
  /**
   * @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, const char *topic, int topic_size, const 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, const char *topic, int topic_size, const 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, const char *topic, int topic_size, const 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