int WebSocketConnectHandler(const struct mg_connection *conn, void *cbdata) { struct mg_context *ctx = mg_get_context(conn); int reject = 1; int i; mg_lock_context(ctx); for (i = 0; i < MAX_WS_CLIENTS; i++) { if (ws_clients[i].conn == NULL) { ws_clients[i].conn = (struct mg_connection *)conn; ws_clients[i].state = 1; mg_set_user_connection_data(ws_clients[i].conn, (void *)(ws_clients + i)); reject = 0; break; } } mg_unlock_context(ctx); fprintf(stdout, "Websocket client %s\r\n\r\n", (reject ? "rejected" : "accepted")); return reject; }
void WebSocketCloseHandler(const struct mg_connection *conn, void *cbdata) { struct mg_context *ctx = mg_get_context(conn); struct t_ws_client *client = mg_get_user_connection_data(conn); ASSERT(client->conn == conn); ASSERT(client->state >= 1); mg_lock_context(ctx); client->state = 0; client->conn = NULL; mg_unlock_context(ctx); fprintf(stdout, "Client droped from the set of webserver connections\r\n\r\n"); }
void InformWebsockets(struct mg_context *ctx) { static unsigned long cnt = 0; char text[32]; int i; sprintf(text, "%lu", ++cnt); mg_lock_context(ctx); for (i = 0; i < MAX_WS_CLIENTS; i++) { if (ws_clients[i].state == 2) { mg_websocket_write(ws_clients[i].conn, WEBSOCKET_OPCODE_TEXT, text, strlen(text)); } } mg_unlock_context(ctx); }