websocket_client.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright (c) 2014 the Civetweb developers
  3. * Copyright (c) 2014 Jordan Shelley
  4. * https://github.com/jshelley
  5. * License http://opensource.org/licenses/mit-license.php MIT License
  6. */
  7. // Simple example program on how to use websocket client embedded C interface.
  8. #ifdef _WIN32
  9. #include <Windows.h>
  10. #define sleep(x) Sleep(1000*(x))
  11. #else
  12. #include <unistd.h>
  13. #endif
  14. #include <assert.h>
  15. #include <string.h>
  16. #include "civetweb.h"
  17. #define DOCUMENT_ROOT "."
  18. #define PORT "8888"
  19. #define SSL_CERT "./ssl/server.pem"
  20. int websock_server_connect(const struct mg_connection * conn)
  21. {
  22. printf("Server: Websocket connected\n");
  23. return 0; /* return 0 to accept every connection */
  24. }
  25. void websocket_server_ready(struct mg_connection * conn)
  26. {
  27. printf("Server: Websocket ready\n");
  28. }
  29. int websocket_server_data(struct mg_connection * conn, int bits, char *data, size_t data_len)
  30. {
  31. printf("Server: Got %u bytes from the client\n", data_len);
  32. return 1; /* return 1 to keep the connetion open */
  33. }
  34. void websocket_server_connection_close(struct mg_connection * conn)
  35. {
  36. printf("Server: Close connection\n");
  37. }
  38. struct mg_context * start_websocket_server()
  39. {
  40. const char * options[] = { "document_root", DOCUMENT_ROOT,
  41. "ssl_certificate", SSL_CERT,
  42. "listening_ports", PORT, 0
  43. };
  44. struct mg_callbacks callbacks;
  45. struct mg_context *ctx;
  46. memset(&callbacks, 0, sizeof(callbacks));
  47. callbacks.websocket_connect = websock_server_connect;
  48. callbacks.websocket_ready = websocket_server_ready;
  49. callbacks.websocket_data = websocket_server_data;
  50. callbacks.connection_close = websocket_server_connection_close;
  51. ctx = mg_start(&callbacks, 0, options);
  52. return ctx;
  53. }
  54. static int websocket_client_data_handler(struct mg_connection *conn, int flags, char *data, size_t data_len)
  55. {
  56. printf("From server: ");
  57. fwrite(data, 1, data_len, stdout);
  58. printf("\n");
  59. return 1;
  60. }
  61. int main(int argc, char *argv[])
  62. {
  63. struct mg_context *ctx;
  64. struct mg_connection* newconn;
  65. char ebuf[100];
  66. /* First set up a websocket server */
  67. ctx = start_websocket_server();
  68. assert(ctx != NULL);
  69. newconn = mg_websocket_client_connect("localhost", atoi(PORT), 0,
  70. ebuf, sizeof(ebuf),
  71. "/websocket", NULL, websocket_client_data_handler);
  72. if (newconn == NULL)
  73. {
  74. printf("Error: %s", ebuf);
  75. return 1;
  76. }
  77. mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data1", 5);
  78. sleep(1);
  79. mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data2", 5);
  80. sleep(1);
  81. mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data3", 5);
  82. sleep(1);
  83. mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data4", 5);
  84. sleep(1);
  85. mg_close_connection(newconn);
  86. mg_stop(ctx);
  87. printf("Bye!\n");
  88. return 0;
  89. }