websocket.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /*
  2. * Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
  3. *
  4. * This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
  5. *
  6. * Use of this source code is governed by MIT-like 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. #include <string.h>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include "mk_mediakit.h"
  14. #define LOG_LEV 4
  15. // 修改此宏,可以选择协议类型 [AUTO-TRANSLATED:7a3e6a3a]
  16. // Modify this macro to choose the protocol type
  17. #define TCP_TYPE mk_type_ws
  18. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. typedef struct {
  20. mk_tcp_session _session;
  21. // 下面你可以夹杂你的私货数据 [AUTO-TRANSLATED:99451203]
  22. // You can insert your private data below
  23. char your_some_useful_data[1024];
  24. } tcp_session_user_data;
  25. /**
  26. * 当tcp客户端连接服务器时触发
  27. * @param session 会话处理对象
  28. * Triggered when the tcp client connects to the server
  29. * @param session Session processing object
  30. * [AUTO-TRANSLATED:0030d1a6]
  31. */
  32. void API_CALL on_mk_tcp_session_create(uint16_t server_port,mk_tcp_session session){
  33. char ip[64];
  34. log_printf(LOG_LEV,"%s %d",mk_tcp_session_peer_ip(session,ip),(int)mk_tcp_session_peer_port(session));
  35. tcp_session_user_data *user_data = malloc(sizeof(tcp_session_user_data));
  36. user_data->_session = session;
  37. mk_tcp_session_set_user_data(session,user_data);
  38. }
  39. /**
  40. * 收到tcp客户端发过来的数据
  41. * @param session 会话处理对象
  42. * @param data 数据指针
  43. * @param len 数据长度
  44. * Receive data sent from the tcp client
  45. * @param session Session processing object
  46. * @param data Data pointer
  47. * @param len Data length
  48. * [AUTO-TRANSLATED:f8f01265]
  49. */
  50. void API_CALL on_mk_tcp_session_data(uint16_t server_port,mk_tcp_session session, mk_buffer buffer){
  51. char ip[64];
  52. log_printf(LOG_LEV,"from %s %d, data[%d]: %s",
  53. mk_tcp_session_peer_ip(session,ip),
  54. (int)mk_tcp_session_peer_port(session),
  55. mk_buffer_get_size(buffer),
  56. mk_buffer_get_data(buffer));
  57. mk_tcp_session_send(session,"echo:",0);
  58. mk_tcp_session_send_buffer(session, buffer);
  59. }
  60. /**
  61. * 每隔2秒的定时器,用于管理超时等任务
  62. * @param session 会话处理对象
  63. * Timer every 2 seconds, used to manage timeout tasks
  64. * @param session Session processing object
  65. * [AUTO-TRANSLATED:f664481f]
  66. */
  67. void API_CALL on_mk_tcp_session_manager(uint16_t server_port,mk_tcp_session session){
  68. char ip[64];
  69. log_printf(LOG_LEV,"%s %d",mk_tcp_session_peer_ip(session,ip),(int)mk_tcp_session_peer_port(session));
  70. }
  71. /**
  72. * 一般由于客户端断开tcp触发
  73. * 本事件中可以调用mk_tcp_session_send_safe函数
  74. * @param session 会话处理对象
  75. * @param code 错误代码
  76. * @param msg 错误提示
  77. * Generally triggered by the client disconnecting tcp
  78. * You can call the mk_tcp_session_send_safe function in this event
  79. * @param session Session processing object
  80. * @param code Error code
  81. * @param msg Error message
  82. * [AUTO-TRANSLATED:62628263]
  83. */
  84. void API_CALL on_mk_tcp_session_disconnect(uint16_t server_port,mk_tcp_session session,int code,const char *msg){
  85. char ip[64];
  86. log_printf(LOG_LEV,"%s %d: %d %s",mk_tcp_session_peer_ip(session,ip),(int)mk_tcp_session_peer_port(session),code,msg);
  87. tcp_session_user_data *user_data = (tcp_session_user_data *)mk_tcp_session_get_user_data(session);
  88. free(user_data);
  89. }
  90. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. typedef struct {
  92. mk_tcp_client client;
  93. // 下面你可以夹杂你的私货数据 [AUTO-TRANSLATED:99451203]
  94. // You can insert your private data below
  95. char your_some_useful_data[1024];
  96. int count;
  97. } tcp_client_user_data;
  98. /**
  99. * tcp客户端连接服务器成功或失败回调
  100. * @param client tcp客户端
  101. * @param code 0为连接成功,否则为失败原因
  102. * @param msg 连接失败错误提示
  103. * Callback for successful or failed connection of tcp client to server
  104. * @param client Tcp client
  105. * @param code 0 for successful connection, otherwise the reason for failure
  106. * @param msg Connection failure error message
  107. * [AUTO-TRANSLATED:0737893b]
  108. */
  109. void API_CALL on_mk_tcp_client_connect(mk_tcp_client client,int code,const char *msg){
  110. log_printf(LOG_LEV,"connect result:%d %s",code,msg);
  111. if(code == 0){
  112. // 连接上后我们发送一个hello world测试数据 [AUTO-TRANSLATED:9eb05433]
  113. // After connecting, we send a hello world test data
  114. mk_tcp_client_send(client,"hello world",0);
  115. }else{
  116. tcp_client_user_data *user_data = mk_tcp_client_get_user_data(client);
  117. mk_tcp_client_release(client);
  118. free(user_data);
  119. }
  120. }
  121. /**
  122. * tcp客户端与tcp服务器之间断开回调
  123. * 一般是eof事件导致
  124. * @param client tcp客户端
  125. * @param code 错误代码
  126. * @param msg 错误提示
  127. * Callback for disconnection between tcp client and tcp server
  128. * Generally caused by eof event
  129. * @param client Tcp client
  130. * @param code Error code
  131. * @param msg Error message
  132. * [AUTO-TRANSLATED:9cfff388]
  133. */
  134. void API_CALL on_mk_tcp_client_disconnect(mk_tcp_client client,int code,const char *msg){
  135. log_printf(LOG_LEV,"disconnect:%d %s",code,msg);
  136. // 服务器主动断开了,我们销毁对象 [AUTO-TRANSLATED:4b142ba4]
  137. // The server actively disconnected, we destroy the object
  138. tcp_client_user_data *user_data = mk_tcp_client_get_user_data(client);
  139. mk_tcp_client_release(client);
  140. free(user_data);
  141. }
  142. /**
  143. * 收到tcp服务器发来的数据
  144. * @param client tcp客户端
  145. * @param data 数据指针
  146. * @param len 数据长度
  147. * Receive data sent from the tcp server
  148. * @param client Tcp client
  149. * @param data Data pointer
  150. * @param len Data length
  151. * [AUTO-TRANSLATED:d152eff2]
  152. */
  153. void API_CALL on_mk_tcp_client_data(mk_tcp_client client, mk_buffer buffer){
  154. log_printf(LOG_LEV, "data[%d]:%s", mk_buffer_get_size(buffer), mk_buffer_get_data(buffer));
  155. }
  156. /**
  157. * 每隔2秒的定时器,用于管理超时等任务
  158. * @param client tcp客户端
  159. * Timer every 2 seconds, used to manage timeout tasks
  160. * @param client Tcp client
  161. * [AUTO-TRANSLATED:ba842db3]
  162. */
  163. void API_CALL on_mk_tcp_client_manager(mk_tcp_client client){
  164. tcp_client_user_data *user_data = mk_tcp_client_get_user_data(client);
  165. char buf[1024];
  166. sprintf(buf,"on_mk_tcp_client_manager:%d",user_data->count);
  167. mk_tcp_client_send(client,buf,0);
  168. if(++user_data->count == 5){
  169. // 发送5遍后主动释放对象 [AUTO-TRANSLATED:43ce72ca]
  170. // Release the object after sending 5 times
  171. mk_tcp_client_release(client);
  172. free(user_data);
  173. }
  174. }
  175. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  176. void test_server(){
  177. mk_tcp_session_events events_server = {
  178. .on_mk_tcp_session_create = on_mk_tcp_session_create,
  179. .on_mk_tcp_session_data = on_mk_tcp_session_data,
  180. .on_mk_tcp_session_manager = on_mk_tcp_session_manager,
  181. .on_mk_tcp_session_disconnect = on_mk_tcp_session_disconnect
  182. };
  183. mk_tcp_server_events_listen(&events_server);
  184. mk_tcp_server_start(80, TCP_TYPE);
  185. }
  186. void test_client(){
  187. mk_tcp_client_events events_clent = {
  188. .on_mk_tcp_client_connect = on_mk_tcp_client_connect,
  189. .on_mk_tcp_client_data = on_mk_tcp_client_data,
  190. .on_mk_tcp_client_disconnect = on_mk_tcp_client_disconnect,
  191. .on_mk_tcp_client_manager = on_mk_tcp_client_manager,
  192. };
  193. mk_tcp_client client = mk_tcp_client_create(&events_clent, TCP_TYPE);
  194. tcp_client_user_data *user_data = (tcp_client_user_data *)malloc(sizeof(tcp_client_user_data));
  195. user_data->client = client;
  196. user_data->count = 0;
  197. mk_tcp_client_set_user_data(client,user_data);
  198. mk_tcp_client_connect(client, "121.40.165.18", 8800, 3);
  199. // 你可以连接127.0.0.1 80测试 [AUTO-TRANSLATED:68544f6e]
  200. // You can connect to 127.0.0.1 80 to test
  201. // mk_tcp_client_connect(client, "127.0.0.1", 80, 3);
  202. }
  203. int main(int argc, char *argv[]) {
  204. char *ini_path = mk_util_get_exe_dir("c_api.ini");
  205. char *ssl_path = mk_util_get_exe_dir("ssl.p12");
  206. mk_config config = {
  207. .ini = ini_path,
  208. .ini_is_path = 1,
  209. .log_level = 0,
  210. .log_mask = LOG_CONSOLE,
  211. .ssl = ssl_path,
  212. .ssl_is_path = 1,
  213. .ssl_pwd = NULL,
  214. .thread_num = 0
  215. };
  216. mk_env_init(&config);
  217. free(ini_path);
  218. free(ssl_path);
  219. test_server();
  220. test_client();
  221. log_info("enter any key to exit");
  222. getchar();
  223. mk_stop_all_server();
  224. return 0;
  225. }