Fixed websocket example, and websocket callback calling logic.

This commit is contained in:
Sergey Lyubka committed 2014-01-17 10:17:15 +00:00
1 parent 65c1278975
commit 7690f9e34b
7 files changed
+95 -194

No files matched your search

+35 -55
View File
@@ -1,67 +1,47 @@
// Copyright (c) 2004-2012 Sergey Lyubka
// This file is a part of mongoose project, http://github.com/valenok/mongoose
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mongoose.h"
static int event_handler(struct mg_event *event) {
extern const char *find_embedded_file(const char *, size_t *);
if (event->type == MG_REQUEST_BEGIN) {
const char *version_header = mg_get_header(event->conn,
"Sec-WebSocket-Version");
if (version_header != NULL) {
// Websocket request, process it
if (strcmp(version_header, "13") != 0) {
mg_printf(event->conn, "%s", "HTTP/1.1 426 Upgrade Required\r\n\r\n");
} else {
static const char *server_ready_message = "server ready";
char *data;
int bits, len, must_exit = 0;
// Handshake, and send initial server message
mg_websocket_handshake(event->conn);
mg_websocket_write(event->conn, WEBSOCKET_OPCODE_TEXT,
server_ready_message, strlen(server_ready_message));
// Read messages sent by client. Echo them back.
while (must_exit == 0 &&
(len = mg_websocket_read(event->conn, &bits, &data)) > 0) {
printf("got message: [%.*s]\n", len, data);
mg_websocket_write(event->conn, WEBSOCKET_OPCODE_TEXT, data, len);
// If the message is "exit", close the connection, exit the loop
if (memcmp(data, "exit", 4) == 0) {
mg_websocket_write(event->conn,
WEBSOCKET_OPCODE_CONNECTION_CLOSE, "", 0);
must_exit = 1;
}
// It's our responsibility to free allocated message
free(data);
}
}
return 1;
}
static void iterate_callback(struct mg_connection *c, void *param) {
if (c->is_websocket) {
char buf[20];
int len = snprintf(buf, sizeof(buf), "%d", * (int *) param);
mg_websocket_write(c, 1, buf, len);
}
}
return 0;
// This handler is called for each incoming websocket frame, one or more
// times for connection lifetime.
static int index_html(struct mg_connection *conn) {
size_t index_size;
const char *index_html = find_embedded_file("websocket.html", &index_size);
if (conn->is_websocket) {
mg_websocket_write(conn, 1, conn->content, conn->content_len);
return conn->content_len == 4 && !memcmp(conn->content, "exit", 4);
} else {
mg_send_header(conn, "Content-Type", "text/html");
mg_send_data(conn, index_html, index_size);
return 1;
}
}
int main(void) {
struct mg_context *ctx;
const char *options[] = {
"listening_ports", "8080",
"document_root", "websocket_html_root",
NULL
};
struct mg_server *server = mg_create_server(NULL);
unsigned int current_timer = 0, last_timer = 0;
ctx = mg_start(options, &event_handler, NULL);
getchar(); // Wait until user hits "enter"
mg_stop(ctx);
mg_set_option(server, "listening_port", "8080");
mg_add_uri_handler(server, "/", index_html);
printf("Started on port %s\n", mg_get_option(server, "listening_port"));
for (;;) {
current_timer = mg_poll_server(server, 100);
if (current_timer - last_timer > 4) {
last_timer = current_timer;
mg_iterate_over_connections(server, iterate_callback, &current_timer);
}
}
mg_destroy_server(&server);
return 0;
}