From e111ee40a26d94d87da184395e8a9f9abeb3ec26 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 30 Aug 2014 00:49:46 +0200 Subject: [PATCH] Fix websocket client example, extend it by a local websocket server --- examples/websocket_client/websocket_client.c | 73 ++++++++++++++++---- 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/examples/websocket_client/websocket_client.c b/examples/websocket_client/websocket_client.c index ae7110f8..6f7f472c 100644 --- a/examples/websocket_client/websocket_client.c +++ b/examples/websocket_client/websocket_client.c @@ -1,4 +1,5 @@ /* +* Copyright (c) 2014 the Civetweb developers * Copyright (c) 2014 Jordan Shelley * https://github.com/jshelley * License http://opensource.org/licenses/mit-license.php MIT License @@ -12,6 +13,7 @@ #include #endif +#include #include #include "civetweb.h" @@ -19,33 +21,72 @@ #define PORT "8888" #define SSL_CERT "./ssl/server.pem" -static int websocket_data_handler(struct mg_connection *conn, int flags, char *data, size_t data_len) -{ - printf("From server: "); - fwrite(data, 1, data_len, stdout); - printf("\r\n"); - return 1; +int websock_server_connect(const struct mg_connection * conn) +{ + printf("Server: Websocket connected\n"); + return 0; /* return 0 to accept every connection */ } -int main(int argc, char *argv[]) +void websocket_server_ready(struct mg_connection * conn) { + printf("Server: Websocket ready\n"); +} +int websocket_server_data(struct mg_connection * conn, int bits, char *data, size_t data_len) +{ + printf("Server: Got %u bytes from the client\n", data_len); + return 1; /* return 1 to keep the connetion open */ +} + +void websocket_server_connection_close(struct mg_connection * conn) +{ + printf("Server: Close connection\n"); +} + +struct mg_context * start_websocket_server() +{ const char * options[] = { "document_root", DOCUMENT_ROOT, "ssl_certificate", SSL_CERT, "listening_ports", PORT, 0 }; struct mg_callbacks callbacks; struct mg_context *ctx; + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.websocket_connect = websock_server_connect; + callbacks.websocket_ready = websocket_server_ready; + callbacks.websocket_data = websocket_server_data; + callbacks.connection_close = websocket_server_connection_close; + ctx = mg_start(&callbacks, 0, options); + + return ctx; +} + + +static int websocket_client_data_handler(struct mg_connection *conn, int flags, char *data, size_t data_len) +{ + printf("From server: "); + fwrite(data, 1, data_len, stdout); + printf("\n"); + + return 1; +} + + +int main(int argc, char *argv[]) +{ + struct mg_context *ctx; struct mg_connection* newconn; char ebuf[100]; - memset(&callbacks, 0, sizeof(callbacks)); - ctx = mg_start(&callbacks, 0, options); + /* First set up a websocket server */ + ctx = start_websocket_server(); + assert(ctx != NULL); - newconn = mg_websocket_client_connect("echo.websocket.org", 443, 1, + newconn = mg_websocket_client_connect("localhost", atoi(PORT), 0, ebuf, sizeof(ebuf), - "/", "http://websocket.org",websocket_data_handler); + "/websocket", NULL, websocket_client_data_handler); if (newconn == NULL) { @@ -55,22 +96,24 @@ int main(int argc, char *argv[]) mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data1", 5); - sleep(5); + sleep(1); mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data2", 5); - sleep(5); + sleep(1); mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data3", 5); - sleep(5); + sleep(1); mg_websocket_write(newconn, WEBSOCKET_OPCODE_TEXT, "data4", 5); - sleep(5); + sleep(1); mg_close_connection(newconn); + mg_stop(ctx); + printf("Bye!\n"); return 0;