zhangmeng
2021-02-22 e888eb3aa0ee76cdbb9a8193be40075857d1cf41
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
#ifndef _c_libshm_queue_so_func_h_
#define _c_libshm_queue_so_func_h_
 
 
#ifdef __cplusplus
extern "C"{
#endif
 
#ifndef net_node_t
typedef struct _net_node_t{
    const char *host;
    int port;
    int key;
} net_node_t;
#endif
 
#ifndef net_mod_recv_msg_t
    #ifndef NI_MAXHOST
        #define _BSD_SOURCE             /* To get definitions of NI_MAXHOST and
                                        NI_MAXSERV from <netdb.h> */
    #include <netdb.h>
    // #define NI_MAXHOST 1025
    #endif
typedef struct _net_mod_recv_msg_t{
  char host[NI_MAXHOST];
  int port;
  int key;
  void *content;
  int content_length;
} net_mod_recv_msg_t;
#endif
 
/**
 * 初始化共享内存
 * @size 共享内存大小
 *
 */
typedef void(*tfn_shm_init)(int);
/**
 * 销毁共享内存
 * 整个进程退出时需要执行这个方法,该方法首先会检查是否还有其他进程在使用该共享内存,如果还有其他进程在使用就只是detach,如果没有其他进程在使用则销毁整块内存。
 */
typedef void(*tfn_shm_destroy)();
/**
 * 获取key
 */
typedef int(*tfn_shm_alloc_key) ();
 
/**
 * @brief 回收标记为删除的队列
 * @return 错误码
 */
typedef int (*tfn_shm_start_resycle)() ;
 
/**
 * 批量删除key对应的共享队列,并在bus里删除该key的订阅
 */
typedef int(*tfn_shm_remove_keys) (int*, int);
typedef int(*tfn_shm_remove_keys_exclude) (int*, int);
 
/////////////////////////////////////////////
// net_mod_socket
/**
 * 创建
 */
typedef void * (*tfn_net_mod_socket_open)();
 
/**
 * 关闭
 */
typedef void (*tfn_net_mod_socket_close)(void *_sockt);
 
 
 
/**
 * 绑定端口到socket, 如果不绑定则系统自动分配一个
 * @return 0 成功, 其他值 失败的错误码
*/
typedef int (*tfn_net_mod_socket_bind)(void * _socket, int key);
 
/**
 * 强制绑定端口到socket, 适用于程序非正常关闭的情况下,重启程序绑定原来还没释放的key
 * @return 0 成功, 其他值 失败的错误码
*/
typedef int (*tfn_net_mod_socket_force_bind)(void * _socket, int key);
 
/**
 * 发送信息
 * @key 发送给谁
 * @return 0 成功, 其他值 失败的错误码
 */
typedef int (*tfn_net_mod_socket_sendto)(void *_socket, const void *buf, const int size, const int key);
// 发送信息超时返回。 @sec 秒 , @nsec 纳秒
typedef int (*tfn_net_mod_socket_sendto_timeout)(void *_socket, const void *buf, const int size, const int key, int sec, int nsec);
// 发送信息立刻返回。
typedef int (*tfn_net_mod_socket_sendto_nowait)(void *_socket, const void *buf, const int size, const int key);
 
/**
 * 接收信息
 * @key 从谁哪里收到的信息
 * @return 0 成功, 其他值 失败的错误码
*/
typedef int (*tfn_net_mod_socket_recvfrom)(void *_socket, void **buf, int *size, int *key);
// 接受信息超时返回。 @sec 秒 , @nsec 纳秒
typedef int (*tfn_net_mod_socket_recvfrom_timeout)(void *_socket, void **buf, int *size, int *key, int sec, int nsec);
typedef int (*tfn_net_mod_socket_recvfrom_nowait)(void *_socket, void **buf, int *size, int *key);
 
 
 
/**
 * 如果建立连接的节点没有接受到消息会一直等待
 * 向node_arr 中的所有网络节点发送请求消息,节点的返回信息汇总并存储在recv_arr中
 * @node_arr 网络节点组, @node_arr_len该数组长度
 * @send_buf 发送的消息,@send_size 该消息体的长度
 * @recv_arr 返回的应答消息组,@recv_arr_size 该数组长度
 * @return 成功发送的节点的个数
 * 优点:1某个节点的故障不会阻塞其他节点。2性能好
 * 缺点:不是线程安全的, 即不能有两个以上的线程同时使用这个对象的方法
 */
typedef int (*tfn_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) ;
/**
 * 如果建立连接的节点没有接受到消息等待timeout的时间后返回
 * @timeout 等待时间,单位是千分之一秒
*/
typedef int (*tfn_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);
 
/**
 * 不等待立即返回
*/
typedef int (*tfn_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 接受消息,并把callback函数返回的数据发送回对方,一直等待完成
 *
 * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param recvsize 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @callback  void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。
 *
 * @return 0是成功, 其他值是失败的错误码
 */
typedef  void(*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data);
typedef int (*tfn_net_mod_socket_recvandsend)(void *_socket, recvandsend_callback_fn callback, void *user_data);
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,在指定的时间内即使没有完成也返回
 *
 * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param recvsize 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @callback  void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。
 *
 * @param sec 秒
 * @param nsec 纳秒
 *
 * @return 0是成功, 其他值是失败的错误码
 */
typedef int (*tfn_net_mod_socket_recvandsend_timeout)(void *_socket, recvandsend_callback_fn callback,
                                      int sec, int nsec, void *user_data) ;
 
 
/**
 * @brief 接受消息,并把callback函数返回的数据发送回对方,无论成功与否立刻返回
 *
 * @param recvbuf 接受到的消息存放的缓存地址,该buf使用完成后需要手动释放
 * @param recvsize 接受到消息的长度
 * @param key 从谁哪里收到的信息
 * @callback  void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize, void * user_data)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示返回的数据,和返回数据的长度。
 *
 * @return 0是成功, 其他值是失败的错误码
 */
typedef int (*tfn_net_mod_socket_recvandsend_nowait)(void *_socket, recvandsend_callback_fn callback, void *user_data) ;
 
/**
 * 启动bus
 *
 * @return 0 成功, 其他值 失败的错误码
*/
//typedef int  (*tfn_net_mod_socket_start_bus)(void * _socket);
 
 
 /**
 * 向node_arr 中的所有网络节点发布消息
 * @node_arr 网络节点组, @node_arr_len该数组长度
 * @topic 主题,@topic_size 该主题的长度
 * @content 内容,@content_size 内容长度
 * @return 成功发布的节点的个数
 */
typedef int (*tfn_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);
typedef int (*tfn_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 timeout);
typedef int (*tfn_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);
 
/**
 * 订阅指定主题
 * @topic 主题
 * @size 主题长度
 * @key 总线端口
 */
typedef int  (*tfn_net_mod_socket_sub)(void * _socket, void *topic, int size);
// 超时返回。 @sec 秒 , @nsec 纳秒
typedef int  (*tfn_net_mod_socket_sub_timeout)(void * _socket, void *topic, int size, int sec, int nsec);
typedef int  (*tfn_net_mod_socket_sub_nowait)(void * _socket, void *topic, int size);
 
 
/**
 * 取消订阅指定主题
 * @topic 主题,主题为空时取消全部订阅
 * @size 主题长度
 * @key 总线端口
 */
typedef int  (*tfn_net_mod_socket_desub)(void * _socket, void *topic, int size);
// 超时返回。 @sec 秒 , @nsec 纳秒
typedef int  (*tfn_net_mod_socket_desub_timeout)(void * _socket, void *topic, int size, int sec, int nsec);
typedef int  (*tfn_net_mod_socket_desub_nowait)(void * _socket, void *topic, int size);
 
 
/**
 * 获取soket端口号
 */
typedef int (*tfn_net_mod_socket_get_key)(void * _socket) ;
 
 
/**
 * 销毁sendandrecv方法返回的消息组
 * @arr 消息组
 * @size 消息组的长度
 */
typedef void  (*tfn_net_mod_socket_free_recv_msg_arr)(net_mod_recv_msg_t * arr, int size);
 
 
/**
 * 释放存储接收信息的buf
 */
typedef void (*tfn_net_mod_socket_free)(void *buf) ;
 
/**
 * 创建
 */
typedef void *(*tfn_net_mod_server_socket_open)(int port) ;
 
/**
 * 关闭
 */
typedef void (*tfn_net_mod_server_socket_close)(void *_sockt) ;
 
/**
 * 启动
 */
typedef int (*tfn_net_mod_server_socket_start)(void *_sockt);
 
/**
 * bus创建
 */
typedef void *(*tfn_bus_server_socket_wrapper_open)() ;
 
/**
 * bus关闭
 */
typedef void (*tfn_bus_server_socket_wrapper_close)(void *_sockt) ;
 
/**
 * bus启动
 */
typedef int (*tfn_bus_server_socket_wrapper_start_bus)(void *_sockt);
 
#ifdef __cplusplus
}
#endif
 
#endif