| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | // Copyright (c) 2004-2012 Sergey Lyubka// This file is a part of civetweb project, http://github.com/sunsetbrew/civetweb#include <stdio.h>#include <string.h>#include "civetweb.h"static void websocket_ready_handler(struct mg_connection *conn){    static const char *message = "server ready";    mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, message, strlen(message));}// Arguments://   flags: first byte of websocket frame, see websocket RFC,//          http://tools.ietf.org/html/rfc6455, section 5.2//   data, data_len: payload data. Mask, if any, is already applied.static int websocket_data_handler(struct mg_connection *conn, int flags,                                  char *data, size_t data_len){    (void) flags; // Unused    mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, data, data_len);    // Returning zero means stoping websocket conversation.    // Close the conversation if client has sent us "exit" string.    return memcmp(data, "exit", 4);}int main(void){    struct mg_context *ctx;    struct mg_callbacks callbacks;    const char *options[] = {        "listening_ports", "8080",        "document_root", "websocket_html_root",        NULL    };    memset(&callbacks, 0, sizeof(callbacks));    callbacks.websocket_ready = websocket_ready_handler;    callbacks.websocket_data = websocket_data_handler;    ctx = mg_start(&callbacks, NULL, options);    getchar();  // Wait until user hits "enter"    mg_stop(ctx);    return 0;}
 |