websocket_chat.c
Go to the documentation of this file.
1 // Copyright (c) 2013-2014 Cesanta Software Limited
2 // $Date: 2014-09-09 17:07:55 UTC $
3 
4 #include <string.h>
5 #include <time.h>
6 #include <signal.h>
7 #include <stdlib.h>
8 #include "mongoose.h"
9 
10 static int s_signal_received = 0;
11 static struct mg_server *s_server = NULL;
12 
13 // Data associated with each websocket connection
14 struct conn_data {
15  int room;
16 };
17 
18 static void signal_handler(int sig_num) {
19  signal(sig_num, signal_handler); // Reinstantiate signal handler
20  s_signal_received = sig_num;
21 }
22 
23 static void handle_websocket_message(struct mg_connection *conn) {
24  struct conn_data *d = (struct conn_data *) conn->connection_param;
25  struct mg_connection *c;
26 
27  printf("[%.*s]\n", (int) conn->content_len, conn->content);
28  if (conn->content_len > 5 && !memcmp(conn->content, "join ", 5)) {
29  // Client joined new room
30  d->room = conn->content[5];
31  } else if (conn->content_len > 4 && !memcmp(conn->content, "msg ", 4) &&
32  d->room != 0 && d->room != '?') {
33  // Client has sent a message. Push this message to all clients
34  // that are subscribed to the same room as client
35  for (c = mg_next(s_server, NULL); c != NULL; c = mg_next(s_server, c)) {
36  struct conn_data *d2 = (struct conn_data *) c->connection_param;
37  if (!c->is_websocket || d2->room != d->room) continue;
38  mg_websocket_printf(c, WEBSOCKET_OPCODE_TEXT, "msg %c %p %.*s",
39  (char) d->room, conn,
40  conn->content_len - 4, conn->content + 4);
41  }
42  }
43 }
44 
45 static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
46  switch (ev) {
47  case MG_REQUEST:
48  if (conn->is_websocket) {
50  return MG_TRUE;
51  } else {
52  mg_send_file(conn, "index.html", NULL); // Return MG_MORE after!
53  return MG_MORE;
54  }
55  case MG_WS_CONNECT:
56  // New websocket connection. Send connection ID back to the client.
57  conn->connection_param = calloc(1, sizeof(struct conn_data));
58  mg_websocket_printf(conn, WEBSOCKET_OPCODE_TEXT, "id %p", conn);
59  return MG_FALSE;
60  case MG_CLOSE:
61  free(conn->connection_param);
62  return MG_TRUE;
63  case MG_AUTH:
64  return MG_TRUE;
65  default:
66  return MG_FALSE;
67  }
68 }
69 
70 int main(void) {
71  s_server = mg_create_server(NULL, ev_handler);
72  mg_set_option(s_server, "listening_port", "8080");
73 
74  signal(SIGTERM, signal_handler);
75  signal(SIGINT, signal_handler);
76 
77  printf("Started on port %s\n", mg_get_option(s_server, "listening_port"));
78  while (s_signal_received == 0) {
79  mg_poll_server(s_server, 100);
80  }
81  mg_destroy_server(&s_server);
82  return 0;
83 }
#define free(ptr)
Definition: curl_memory.h:130
d
int is_websocket
Definition: mongoose.h:52
struct mg_connection * mg_next(struct mg_server *s, struct mg_connection *c)
Definition: mongoose.c:4983
Chain d2()
void * connection_param
Definition: mongoose.h:56
static int ev_handler(struct mg_connection *conn, enum mg_event ev)
size_t mg_websocket_printf(struct mg_connection *conn, int opcode, const char *fmt,...)
Definition: mongoose.c:3101
struct mg_server * mg_create_server(void *server_data, mg_handler_t handler)
Definition: mongoose.c:5431
const char * mg_get_option(const struct mg_server *server, const char *name)
Definition: mongoose.c:5425
if(strcmp(arg,"1305")!=0)
Definition: unit1305.c:127
int main(void)
time_t mg_poll_server(struct mg_server *server, int milliseconds)
Definition: mongoose.c:4965
#define printf
Definition: curl_printf.h:40
mg_event
Definition: mongoose.h:62
static void handle_websocket_message(struct mg_connection *conn)
static int s_signal_received
static void signal_handler(int sig_num)
static struct mg_server * s_server
const char * mg_set_option(struct mg_server *server, const char *name, const char *value)
Definition: mongoose.c:5143
void mg_send_file(struct mg_connection *c, const char *file_name, const char *extra_headers)
Definition: mongoose.c:4585
void mg_destroy_server(struct mg_server **server)
Definition: mongoose.c:4969
size_t content_len
Definition: mongoose.h:50
#define calloc(nbelem, size)
Definition: curl_memory.h:126
char * content
Definition: mongoose.h:49


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:17