From 67e3c625a5fff1f5d61b3c6fdc47883530cd654b Mon Sep 17 00:00:00 2001 From: sairajzero Date: Sun, 20 Oct 2019 21:53:54 +0530 Subject: [PATCH] Adding chat-room websocket-server --- README.md | 28 ++++++++++++- chatRoomWSServer | Bin 0 -> 172064 bytes chatRoomWSServer.c | 96 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100755 chatRoomWSServer create mode 100644 chatRoomWSServer.c diff --git a/README.md b/README.md index 585d841..6a6e92e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ # flo_chatRoom -Send and receive messages (broadcast or unicast with floID) through web socket +Web Socket based chat room for FLO + +There are 2 types of messages : +1. unicast - sends message only to a FLO_ID +2. broadcast - sends message to all in the chatroom + + +### To install : + + gcc chatRoomWSServer.c mongoose.c -o chatRoomWSServer + +### To run the server : + + ./chatRoomWSServer + +### Instructions : + +1. Open `127.0.0.1:8000` in your web browser +2. To bind FLO_ID : + `$self_FLO_ID` +3. To unicast message to a FLO_ID : + `>receiverFLO_ID message` +4. To broadcast : + `message` + + Note : + You can receive unicast only if a FLO_ID is bound \ No newline at end of file diff --git a/chatRoomWSServer b/chatRoomWSServer new file mode 100755 index 0000000000000000000000000000000000000000..444f50aed1b431fe9fb2ad33c7a805964b6af39d GIT binary patch literal 172064 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 (cD0e!U0Ye{P@7o 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%0DO|p<3S5x!B-`Qb645Sk4(t#&vi@r;m7T## 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 JqtmU={~xcP`DXwC literal 0 HcmV?d00001 diff --git a/chatRoomWSServer.c b/chatRoomWSServer.c new file mode 100644 index 0000000..4f79e31 --- /dev/null +++ b/chatRoomWSServer.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2014 Cesanta Software Limited + * All rights reserved + */ + +#include "mongoose.h" + +static sig_atomic_t s_signal_received = 0; +static const char *s_http_port = "8000"; +static struct mg_serve_http_opts s_http_server_opts; + +static void signal_handler(int sig_num) { + signal(sig_num, signal_handler); // Reinstantiate signal handler + s_signal_received = sig_num; +} + +static int is_websocket(const struct mg_connection *nc) { + return nc->flags & MG_F_IS_WEBSOCKET; +} + +static void broadcast(struct mg_connection *nc, const struct mg_str msg) { + struct mg_connection *c; + printf("(Broadcast) \t[%d]\n", (int)msg.len); + for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) { + if (c == nc) continue; /* Don't send to the sender. */ + mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, msg.p, (int)msg.len); + } +} + +void unicast(struct mg_connection *nc, const struct mg_str msg) { + struct mg_connection *c; + char recipient_floID[35]; + snprintf(recipient_floID, sizeof(recipient_floID), "%.*s", 34, &msg.p[1]); + printf("%s \t[%d]\n",recipient_floID, (int)msg.len - 36); /* Local echo. */ + for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) { + if (!strcmp(c->floID,recipient_floID)) /* Send to receiver */ + mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, &msg.p[36], (int)msg.len - 36); + } +} + +static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { + switch (ev) { + case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { + /* New websocket connection. Tell everybody. */ + break; + } + case MG_EV_WEBSOCKET_FRAME: { + struct websocket_message *wm = (struct websocket_message *) ev_data; + /* New websocket message. Tell everybody. */ + struct mg_str d = {(char *) wm->data, wm->size}; + if (d.p[0] == '$') + snprintf(nc->floID, sizeof(nc->floID), "%.*s", 34, &d.p[1]); + else if ((d.p[0] == '>')) + unicast(nc, d); + else + broadcast(nc, d); + break; + } + case MG_EV_HTTP_REQUEST: { + mg_serve_http(nc, (struct http_message *) ev_data, s_http_server_opts); + break; + } + case MG_EV_CLOSE: { + /* Disconnect. Tell everybody. */ + if (is_websocket(nc)) { + //broadcast(nc, mg_mk_str("-- left")); + } + break; + } + } +} + +int main(void) { + struct mg_mgr mgr; + struct mg_connection *nc; + + signal(SIGTERM, signal_handler); + signal(SIGINT, signal_handler); + setvbuf(stdout, NULL, _IOLBF, 0); + setvbuf(stderr, NULL, _IOLBF, 0); + + mg_mgr_init(&mgr, NULL); + + nc = mg_bind(&mgr, s_http_port, ev_handler); + mg_set_protocol_http_websocket(nc); + s_http_server_opts.document_root = "web"; // Serve current directory + s_http_server_opts.enable_directory_listing = "no"; + + printf("Started on port %s\n", s_http_port); + while (s_signal_received == 0) { + mg_mgr_poll(&mgr, 200); + } + mg_mgr_free(&mgr); + + return 0; +}