diff --git a/examples/websocket_echo_server/Makefile b/examples/websocket_echo_server/Makefile new file mode 100644 index 00000000..3e875230 --- /dev/null +++ b/examples/websocket_echo_server/Makefile @@ -0,0 +1,12 @@ +# Copyright (c) 2014 Cesanta Software +# All rights reserved + +PROG = websocket_echo_server +CFLAGS = -W -Wall -I../.. -g -O0 $(CFLAGS_EXTRA) +SOURCES = $(PROG).c ../../mongoose.c + +$(PROG): $(SOURCES) + $(CC) -o $(PROG) $(SOURCES) $(CFLAGS) + +clean: + rm -rf $(PROG) *.exe *.dSYM *.obj *.exp .*o *.lib diff --git a/examples/websocket.html b/examples/websocket_echo_server/index.html similarity index 100% rename from examples/websocket.html rename to examples/websocket_echo_server/index.html diff --git a/examples/websocket.c b/examples/websocket_echo_server/websocket_echo_server.c similarity index 55% rename from examples/websocket.c rename to examples/websocket_echo_server/websocket_echo_server.c index 8810e438..7e430fa8 100644 --- a/examples/websocket.c +++ b/examples/websocket_echo_server/websocket_echo_server.c @@ -1,27 +1,24 @@ +// Copyright (c) 2013-2014 Cesanta Software Limited +// $Date: 2014-09-09 08:27:35 UTC $ + #include #include #include "mongoose.h" -#ifdef _WIN32 -#define snprintf _snprintf -#endif +static void push_message(struct mg_server *server, time_t current_time) { + struct mg_connection *c; + char buf[20]; + int len = sprintf(buf, "%lu", (unsigned long) current_time); -extern const char *find_embedded_file(const char *, size_t *); - -static int iterate_callback(struct mg_connection *c, enum mg_event ev) { - if (ev == MG_POLL && c->is_websocket) { - char buf[20]; - int len = snprintf(buf, sizeof(buf), "%lu", - (unsigned long) * (time_t *) c->callback_param); - mg_websocket_write(c, 1, buf, len); + // Iterate over all connections, and push current time message to websocket ones. + for (c = mg_next(server, NULL); c != NULL; c = mg_next(server, c)) { + if (c->is_websocket) { + mg_websocket_write(c, 1, buf, len); + } } - return MG_TRUE; } static int send_reply(struct mg_connection *conn) { - size_t index_size; - const char *index_html = find_embedded_file("websocket.html", &index_size); - if (conn->is_websocket) { // This handler is called for each incoming websocket frame, one or more // times for connection lifetime. @@ -30,19 +27,16 @@ static int send_reply(struct mg_connection *conn) { return conn->content_len == 4 && !memcmp(conn->content, "exit", 4) ? MG_FALSE : MG_TRUE; } else { - mg_send_header(conn, "Content-Type", "text/html"); - mg_send_data(conn, index_html, index_size); - return MG_TRUE; + mg_send_file(conn, "index.html"); + return MG_MORE; } } static int ev_handler(struct mg_connection *conn, enum mg_event ev) { - if (ev == MG_REQUEST) { - return send_reply(conn); - } else if (ev == MG_AUTH) { - return MG_TRUE; - } else { - return MG_FALSE; + switch (ev) { + case MG_AUTH: return MG_TRUE; + case MG_REQUEST: return send_reply(conn); + default: return MG_FALSE; } } @@ -58,7 +52,7 @@ int main(void) { current_timer = time(NULL); if (current_timer - last_timer > 0) { last_timer = current_timer; - mg_iterate_over_connections(server, iterate_callback, ¤t_timer); + push_message(server, current_timer); } }