mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-27 12:26:24 +00:00
Fixed websocket example, and websocket callback calling logic.
This commit is contained in:
1 parent
65c1278975
commit
7690f9e34b
7 files changed
+95
-194
No files matched your search
+35
-55
@@ -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, ¤t_timer);
|
||||
}
|
||||
}
|
||||
|
||||
mg_destroy_server(&server);
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user