Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

266 строки
9.6KB

  1. /*
  2. * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
  3. *
  4. * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
  5. *
  6. * Use of this source code is governed by MIT license that can be found in the
  7. * LICENSE file in the root of the source tree. All contributing project authors
  8. * may be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #ifndef MK_TCP_H
  11. #define MK_TCP_H
  12. #include "mk_common.h"
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. ///////////////////////////////////////////Buffer::Ptr/////////////////////////////////////////////
  17. typedef void *mk_buffer;
  18. typedef void(API_CALL *on_mk_buffer_free)(void *user_data, void *data);
  19. /**
  20. * 创建buffer对象
  21. * @param data 数据指针
  22. * @param len 数据长度
  23. * @param cb 数据指针free回调函数,该参数置空时,内部会拷贝数据
  24. * @param user_data 数据指针free回调函数on_mk_buffer_free第一个参数
  25. * @return buffer对象
  26. */
  27. API_EXPORT mk_buffer API_CALL mk_buffer_from_char(const char *data, size_t len, on_mk_buffer_free cb, void *user_data);
  28. API_EXPORT mk_buffer API_CALL mk_buffer_ref(mk_buffer buffer);
  29. API_EXPORT void API_CALL mk_buffer_unref(mk_buffer buffer);
  30. API_EXPORT const char* API_CALL mk_buffer_get_data(mk_buffer buffer);
  31. API_EXPORT size_t API_CALL mk_buffer_get_size(mk_buffer buffer);
  32. ///////////////////////////////////////////SockInfo/////////////////////////////////////////////
  33. //SockInfo对象的C映射
  34. typedef void* mk_sock_info;
  35. //SockInfo::get_peer_ip()
  36. API_EXPORT const char* API_CALL mk_sock_info_peer_ip(const mk_sock_info ctx, char *buf);
  37. //SockInfo::get_local_ip()
  38. API_EXPORT const char* API_CALL mk_sock_info_local_ip(const mk_sock_info ctx, char *buf);
  39. //SockInfo::get_peer_port()
  40. API_EXPORT uint16_t API_CALL mk_sock_info_peer_port(const mk_sock_info ctx);
  41. //SockInfo::get_local_port()
  42. API_EXPORT uint16_t API_CALL mk_sock_info_local_port(const mk_sock_info ctx);
  43. #ifndef SOCK_INFO_API_RENAME
  44. #define SOCK_INFO_API_RENAME
  45. //mk_tcp_session对象转换成mk_sock_info对象后再获取网络相关信息
  46. #define mk_tcp_session_peer_ip(x,buf) mk_sock_info_peer_ip(mk_tcp_session_get_sock_info(x),buf)
  47. #define mk_tcp_session_local_ip(x,buf) mk_sock_info_local_ip(mk_tcp_session_get_sock_info(x),buf)
  48. #define mk_tcp_session_peer_port(x) mk_sock_info_peer_port(mk_tcp_session_get_sock_info(x))
  49. #define mk_tcp_session_local_port(x) mk_sock_info_local_port(mk_tcp_session_get_sock_info(x))
  50. //mk_tcp_client对象转换成mk_sock_info对象后再获取网络相关信息
  51. #define mk_tcp_client_peer_ip(x,buf) mk_sock_info_peer_ip(mk_tcp_client_get_sock_info(x),buf)
  52. #define mk_tcp_client_local_ip(x,buf) mk_sock_info_local_ip(mk_tcp_client_get_sock_info(x),buf)
  53. #define mk_tcp_client_peer_port(x) mk_sock_info_peer_port(mk_tcp_client_get_sock_info(x))
  54. #define mk_tcp_client_local_port(x) mk_sock_info_local_port(mk_tcp_client_get_sock_info(x))
  55. #endif
  56. ///////////////////////////////////////////TcpSession/////////////////////////////////////////////
  57. //TcpSession对象的C映射
  58. typedef void* mk_tcp_session;
  59. typedef void* mk_tcp_session_ref;
  60. //获取基类指针以便获取其网络相关信息
  61. API_EXPORT mk_sock_info API_CALL mk_tcp_session_get_sock_info(const mk_tcp_session ctx);
  62. //TcpSession::safeShutdown()
  63. API_EXPORT void API_CALL mk_tcp_session_shutdown(const mk_tcp_session ctx,int err,const char *err_msg);
  64. //TcpSession::send()
  65. API_EXPORT void API_CALL mk_tcp_session_send(const mk_tcp_session ctx, const char *data, size_t len);
  66. API_EXPORT void API_CALL mk_tcp_session_send_buffer(const mk_tcp_session ctx, mk_buffer buffer);
  67. //切换到该对象所在线程后再TcpSession::send()
  68. API_EXPORT void API_CALL mk_tcp_session_send_safe(const mk_tcp_session ctx, const char *data, size_t len);
  69. API_EXPORT void API_CALL mk_tcp_session_send_buffer_safe(const mk_tcp_session ctx, mk_buffer buffer);
  70. //创建mk_tcp_session的弱引用
  71. API_EXPORT mk_tcp_session_ref API_CALL mk_tcp_session_ref_from(const mk_tcp_session ctx);
  72. //删除mk_tcp_session的弱引用
  73. API_EXPORT void mk_tcp_session_ref_release(const mk_tcp_session_ref ref);
  74. //根据弱引用获取mk_tcp_session,如果mk_tcp_session已经销毁,那么返回NULL
  75. API_EXPORT mk_tcp_session mk_tcp_session_from_ref(const mk_tcp_session_ref ref);
  76. ///////////////////////////////////////////自定义tcp服务/////////////////////////////////////////////
  77. typedef struct {
  78. /**
  79. * 收到mk_tcp_session创建对象
  80. * @param server_port 服务器端口号
  81. * @param session 会话处理对象
  82. */
  83. void (API_CALL *on_mk_tcp_session_create)(uint16_t server_port,mk_tcp_session session);
  84. /**
  85. * 收到客户端发过来的数据
  86. * @param server_port 服务器端口号
  87. * @param session 会话处理对象
  88. * @param buffer 数据
  89. */
  90. void (API_CALL *on_mk_tcp_session_data)(uint16_t server_port,mk_tcp_session session, mk_buffer buffer);
  91. /**
  92. * 每隔2秒的定时器,用于管理超时等任务
  93. * @param server_port 服务器端口号
  94. * @param session 会话处理对象
  95. */
  96. void (API_CALL *on_mk_tcp_session_manager)(uint16_t server_port,mk_tcp_session session);
  97. /**
  98. * 一般由于客户端断开tcp触发
  99. * @param server_port 服务器端口号
  100. * @param session 会话处理对象
  101. * @param code 错误代码
  102. * @param msg 错误提示
  103. */
  104. void (API_CALL *on_mk_tcp_session_disconnect)(uint16_t server_port,mk_tcp_session session,int code,const char *msg);
  105. } mk_tcp_session_events;
  106. typedef enum {
  107. //普通的tcp
  108. mk_type_tcp = 0,
  109. //ssl类型的tcp
  110. mk_type_ssl = 1,
  111. //基于websocket的连接
  112. mk_type_ws = 2,
  113. //基于ssl websocket的连接
  114. mk_type_wss = 3
  115. }mk_tcp_type;
  116. /**
  117. * tcp会话对象附着用户数据
  118. * 该函数只对mk_tcp_server_server_start启动的服务类型有效
  119. * @param session 会话对象
  120. * @param user_data 用户数据指针
  121. */
  122. API_EXPORT void API_CALL mk_tcp_session_set_user_data(mk_tcp_session session,void *user_data);
  123. /**
  124. * 获取tcp会话对象上附着的用户数据
  125. * 该函数只对mk_tcp_server_server_start启动的服务类型有效
  126. * @param session tcp会话对象
  127. * @return 用户数据指针
  128. */
  129. API_EXPORT void* API_CALL mk_tcp_session_get_user_data(mk_tcp_session session);
  130. /**
  131. * 开启tcp服务器
  132. * @param port 监听端口号,0则为随机
  133. * @param type 服务器类型
  134. */
  135. API_EXPORT uint16_t API_CALL mk_tcp_server_start(uint16_t port, mk_tcp_type type);
  136. /**
  137. * 监听tcp服务器事件
  138. */
  139. API_EXPORT void API_CALL mk_tcp_server_events_listen(const mk_tcp_session_events *events);
  140. ///////////////////////////////////////////自定义tcp客户端/////////////////////////////////////////////
  141. typedef void* mk_tcp_client;
  142. //获取基类指针以便获取其网络相关信息
  143. API_EXPORT mk_sock_info API_CALL mk_tcp_client_get_sock_info(const mk_tcp_client ctx);
  144. typedef struct {
  145. /**
  146. * tcp客户端连接服务器成功或失败回调
  147. * @param client tcp客户端
  148. * @param code 0为连接成功,否则为失败原因
  149. * @param msg 连接失败错误提示
  150. */
  151. void (API_CALL *on_mk_tcp_client_connect)(mk_tcp_client client,int code,const char *msg);
  152. /**
  153. * tcp客户端与tcp服务器之间断开回调
  154. * 一般是eof事件导致
  155. * @param client tcp客户端
  156. * @param code 错误代码
  157. * @param msg 错误提示
  158. */
  159. void (API_CALL *on_mk_tcp_client_disconnect)(mk_tcp_client client,int code,const char *msg);
  160. /**
  161. * 收到tcp服务器发来的数据
  162. * @param client tcp客户端
  163. * @param buffer 数据
  164. */
  165. void (API_CALL *on_mk_tcp_client_data)(mk_tcp_client client, mk_buffer buffer);
  166. /**
  167. * 每隔2秒的定时器,用于管理超时等任务
  168. * @param client tcp客户端
  169. */
  170. void (API_CALL *on_mk_tcp_client_manager)(mk_tcp_client client);
  171. } mk_tcp_client_events;
  172. /**
  173. * 创建tcp客户端
  174. * @param events 回调函数结构体
  175. * @param user_data 用户数据指针
  176. * @param type 客户端类型
  177. * @return 客户端对象
  178. */
  179. API_EXPORT mk_tcp_client API_CALL mk_tcp_client_create(mk_tcp_client_events *events, mk_tcp_type type);
  180. /**
  181. * 释放tcp客户端
  182. * @param ctx 客户端对象
  183. */
  184. API_EXPORT void API_CALL mk_tcp_client_release(mk_tcp_client ctx);
  185. /**
  186. * 发起连接
  187. * @param ctx 客户端对象
  188. * @param host 服务器ip或域名
  189. * @param port 服务器端口号
  190. * @param time_out_sec 超时时间
  191. */
  192. API_EXPORT void API_CALL mk_tcp_client_connect(mk_tcp_client ctx, const char *host, uint16_t port, float time_out_sec);
  193. /**
  194. * 非线程安全的发送数据
  195. * 开发者如果能确保在本对象网络线程内,可以调用此此函数
  196. * @param ctx 客户端对象
  197. * @param data 数据指针
  198. * @param len 数据长度,等于0时,内部通过strlen获取
  199. */
  200. API_EXPORT void API_CALL mk_tcp_client_send(mk_tcp_client ctx, const char *data, int len);
  201. API_EXPORT void API_CALL mk_tcp_client_send_buffer(mk_tcp_client ctx, mk_buffer buffer);
  202. /**
  203. * 切换到本对象的网络线程后再发送数据
  204. * @param ctx 客户端对象
  205. * @param data 数据指针
  206. * @param len 数据长度,等于0时,内部通过strlen获取
  207. */
  208. API_EXPORT void API_CALL mk_tcp_client_send_safe(mk_tcp_client ctx, const char *data, int len);
  209. API_EXPORT void API_CALL mk_tcp_client_send_buffer_safe(mk_tcp_client ctx, mk_buffer buffer);
  210. /**
  211. * 客户端附着用户数据
  212. * @param ctx 客户端对象
  213. * @param user_data 用户数据指针
  214. */
  215. API_EXPORT void API_CALL mk_tcp_client_set_user_data(mk_tcp_client ctx,void *user_data);
  216. /**
  217. * 获取客户端对象上附着的用户数据
  218. * @param ctx 客户端对象
  219. * @return 用户数据指针
  220. */
  221. API_EXPORT void* API_CALL mk_tcp_client_get_user_data(mk_tcp_client ctx);
  222. #ifdef __cplusplus
  223. }
  224. #endif
  225. #endif //MK_TCP_H