2014-01-17 19:45:57 +08:00
|
|
|
#include <string.h>
|
2014-03-02 20:16:09 +08:00
|
|
|
#include <time.h>
|
2012-09-19 19:31:19 +08:00
|
|
|
#include "mongoose.h"
|
|
|
|
|
2014-03-02 20:23:53 +08:00
|
|
|
#ifdef _WIN32
|
|
|
|
#define snprintf _snprintf
|
|
|
|
#endif
|
|
|
|
|
2014-01-17 18:17:15 +08:00
|
|
|
extern const char *find_embedded_file(const char *, size_t *);
|
2013-09-30 05:43:58 +08:00
|
|
|
|
2014-03-02 20:16:09 +08:00
|
|
|
static int iterate_callback(struct mg_connection *c, enum mg_event ev) {
|
|
|
|
static int counter = 0;
|
|
|
|
if (ev == MG_POLL && c->is_websocket) {
|
2014-01-17 18:17:15 +08:00
|
|
|
char buf[20];
|
2014-03-02 20:16:09 +08:00
|
|
|
int len = snprintf(buf, sizeof(buf), "%d", counter++);
|
2014-01-17 18:17:15 +08:00
|
|
|
mg_websocket_write(c, 1, buf, len);
|
2013-09-28 18:00:54 +08:00
|
|
|
}
|
2014-03-02 20:16:09 +08:00
|
|
|
return MG_TRUE;
|
2014-01-17 18:17:15 +08:00
|
|
|
}
|
2013-09-28 18:00:54 +08:00
|
|
|
|
2014-03-02 20:16:09 +08:00
|
|
|
static int send_reply(struct mg_connection *conn) {
|
2014-01-17 18:17:15 +08:00
|
|
|
size_t index_size;
|
|
|
|
const char *index_html = find_embedded_file("websocket.html", &index_size);
|
|
|
|
|
|
|
|
if (conn->is_websocket) {
|
2014-01-18 00:37:05 +08:00
|
|
|
// This handler is called for each incoming websocket frame, one or more
|
|
|
|
// times for connection lifetime.
|
|
|
|
// Echo websocket data back to the client.
|
2014-01-17 18:17:15 +08:00
|
|
|
mg_websocket_write(conn, 1, conn->content, conn->content_len);
|
2014-01-28 20:42:13 +08:00
|
|
|
return conn->content_len == 4 && !memcmp(conn->content, "exit", 4) ?
|
2014-03-02 20:16:09 +08:00
|
|
|
MG_FALSE : MG_TRUE;
|
2014-01-17 18:17:15 +08:00
|
|
|
} else {
|
|
|
|
mg_send_header(conn, "Content-Type", "text/html");
|
|
|
|
mg_send_data(conn, index_html, index_size);
|
2014-03-02 20:16:09 +08:00
|
|
|
return MG_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
|
|
|
|
if (ev == MG_REQ_BEGIN) {
|
|
|
|
return send_reply(conn);
|
|
|
|
} else if (ev == MG_AUTH) {
|
|
|
|
return MG_TRUE;
|
|
|
|
} else {
|
|
|
|
return MG_FALSE;
|
2014-01-17 18:17:15 +08:00
|
|
|
}
|
2012-09-19 19:31:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int main(void) {
|
2014-03-02 20:16:09 +08:00
|
|
|
struct mg_server *server = mg_create_server(NULL, ev_handler);
|
|
|
|
time_t current_timer = 0, last_timer = time(NULL);
|
2014-01-17 18:17:15 +08:00
|
|
|
|
|
|
|
mg_set_option(server, "listening_port", "8080");
|
|
|
|
|
|
|
|
printf("Started on port %s\n", mg_get_option(server, "listening_port"));
|
|
|
|
for (;;) {
|
2014-03-02 20:16:09 +08:00
|
|
|
mg_poll_server(server, 100);
|
|
|
|
current_timer = time(NULL);
|
2014-01-28 20:42:13 +08:00
|
|
|
if (current_timer - last_timer > 0) {
|
2014-01-17 18:17:15 +08:00
|
|
|
last_timer = current_timer;
|
2014-03-02 20:16:09 +08:00
|
|
|
mg_iterate_over_connections(server, iterate_callback);
|
2014-01-17 18:17:15 +08:00
|
|
|
}
|
|
|
|
}
|
2012-09-19 19:31:19 +08:00
|
|
|
|
2014-01-17 18:17:15 +08:00
|
|
|
mg_destroy_server(&server);
|
2012-09-19 19:31:19 +08:00
|
|
|
return 0;
|
|
|
|
}
|