Csilk 0.2.1
A lightweight, high-performance C HTTP web framework
Loading...
Searching...
No Matches
ws_room.c File Reference

WebSocket room management and broadcast based on MQ. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
#include "csilk/core/internal.h"
#include "csilk/csilk.h"
Include dependency graph for ws_room.c:

Data Structures

struct  ws_room_t
 
struct  ws_room_manager_t
 

Functions

static void ws_room_manager_init ()
 
static ws_room_tfind_room (const char *name)
 
static void on_room_message (csilk_mq_ctx_t *ctx)
 
void csilk_ws_join_room (csilk_ctx_t *c, const char *room_name)
 Join a WebSocket client to a room.
 
void csilk_ws_leave_room (csilk_ctx_t *c, const char *room_name)
 Remove a WebSocket client from a room.
 
void csilk_ws_broadcast_room (csilk_ctx_t *c, const char *room_name, const char *message)
 Broadcast a message to all WebSockets in a room via MQ.
 

Variables

static ws_room_manager_t g_room_manager
 
static int g_room_manager_initialized = 0
 

Detailed Description

WebSocket room management and broadcast based on MQ.

Implements a high-concurrency room broadcasting system for WebSockets. It leverages the internal Message Queue (MQ) as the event bus.

Architecture:

  • Each room is mapped to an MQ topic: "ws.room.<room_name>".
  • A global Room Manager maintains a list of active clients per room.
  • A single MQ subscriber per room handles broadcasting to all connected clients.

Data Structure Documentation

◆ ws_room_t

struct ws_room_t
Data Fields
csilk_ctx_t ** clients
int clients_capacity
int clients_count
char * room_name

◆ ws_room_manager_t

struct ws_room_manager_t
Collaboration diagram for ws_room_manager_t:
Data Fields
uv_mutex_t mutex
ws_room_t ** rooms
int rooms_capacity
int rooms_count

Function Documentation

◆ csilk_ws_broadcast_room()

void csilk_ws_broadcast_room ( csilk_ctx_t *  c,
const char *  room_name,
const char *  message 
)

Broadcast a message to all WebSockets in a room via MQ.

Parameters
cRequest context (used to access the server's MQ).
room_nameRoom to broadcast to.
messageNUL-terminated message string.

◆ csilk_ws_join_room()

void csilk_ws_join_room ( csilk_ctx_t *  c,
const char *  room_name 
)

Join a WebSocket client to a room.

Parameters
cRequest context (must be a WebSocket).
room_nameName of the room to join.

◆ csilk_ws_leave_room()

void csilk_ws_leave_room ( csilk_ctx_t *  c,
const char *  room_name 
)

Remove a WebSocket client from a room.

Parameters
cRequest context.
room_nameName of the room to leave.

◆ find_room()

static ws_room_t * find_room ( const char *  name)
static

◆ on_room_message()

static void on_room_message ( csilk_mq_ctx_t *  ctx)
static

◆ ws_room_manager_init()

static void ws_room_manager_init ( )
static

Variable Documentation

◆ g_room_manager

ws_room_manager_t g_room_manager
static

◆ g_room_manager_initialized

int g_room_manager_initialized = 0
static