wsServer: una biblioteca de servidor WebSocket muy pequeña escrita en C
wsServer es una biblioteca de servidor WebSocket pequeña y liviana escrita en C que pretende ser fácil de usar, rápida, pirateable y compatible con RFC 6455.
Las características principales son:
Enviar/recibir mensajes de texto y binarios
Marcos de PING/PONG
Apretones de manos de apertura/cierre
Basado en eventos (onmessage, onopen, onclose)
Portabilidad: Funciona bien en Windows, Linux (incluido Android), macOS y FreeBSD
Consulte el informe de Autobahn y los documentos para obtener un análisis "en profundidad".
wsServer sólo requiere un compilador compatible con C99 (como GCC, Clang, TCC y otros) y ninguna biblioteca externa.
La forma preferida de construir wsServer en entornos Linux:
clon de git https://github.com/Theldus/wsServercd wsServer/ make# Opcionalmente, un usuario también puede instalar wsServer en el sistema,# ya sea en las rutas predeterminadas o proporcionando PREFIX o DESTDIR env# vars al Makefile.make install # O make install DESTDIR=/my/folder/
CMake permite al usuario construir fácilmente wsServer en otros entornos distintos de Linux y también permite el uso de un IDE para construir el proyecto automáticamente. Si ese es tu caso:
clon de git https://github.com/Theldus/wsServercd wsServer/ compilación mkdir && compilación cd/ cmake.. hacer ./examples/echo/echo # Esperando conexiones entrantes...
Windows tiene soporte nativo a través de MinGW; los pasos de configuración y compilación de la cadena de herramientas se detallan aquí.
wsServer simplifica la gestión de sockets al permitirle centrarse sólo en tres tipos diferentes de eventos:
/* Nuevo cliente. */void onopen(ws_cli_conn_t client);/* Cliente desconectado. */void onclose(ws_cli_conn_t client);/* El cliente envió un mensaje de texto. */void onmessage(cliente ws_cli_conn_t, const unsigned char *msg, tamaño uint64_t, tipo int);
Esto es lo único de lo que debes preocuparte. No tiene que pensar en los valores de retorno en el socket, en aceptar conexiones ni en nada más. Como beneficio adicional, cada cliente se maneja en un hilo separado, por lo que tampoco hay necesidad de preocuparse por eso.
Se pueden encontrar más ejemplos, incluidos sus respectivos archivos html, en la carpeta ejemplos/, ;-).
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ws.h>/** * @brief Esta función se llama cada vez que se abre una nueva conexión. * @param client Conexión del cliente. */void onopen(cliente ws_cli_conn_t) {char *cli;cli = ws_getaddress(cliente);printf("Conexión abierta, dirección: %sn", cli); }/** * @brief Esta función se llama cada vez que se cierra una conexión. * @param client Conexión del cliente. */void onclose(cliente ws_cli_conn_t) {char *cli;cli = ws_getaddress(cliente);printf("Conexión cerrada, dirección: %sn", cli); }/** * @brief Los eventos del mensaje van aquí. * @param client Conexión del cliente. * @param msg Contenido del mensaje. * @param size Tamaño del mensaje. * @param type Tipo de mensaje. */void onmessage(cliente ws_cli_conn_t,const unsigned char *msg, tamaño uint64_t, tipo int) {char *cli;cli = ws_getaddress(cliente);printf("Recibo un mensaje: %s (%zu), de: %sn", msg,size, cli);sleep(2);ws_sendframe_txt(cliente, " hola");sleep(2);ws_sendframe_txt(cliente, "mundo"); }int principal(nulo) {/* * Bucle principal, esta función nunca* regresa. * * *Si .thread_loop es != 0, se crea un nuevo hilo * para manejar nuevas conexiones y ws_socket() se vuelve * sin bloqueo. */ws_socket(&(struct ws_server){/* * Vincular host, como: * localhost -> localhost/127.0.0.1 * 0.0.0.0 -> IPv4 global * :: -> IPv4+IPv6 global (pila dual) * /.host = "localhost", .puerto = 8080, .thread_loop = 0, .timeout_ms = 1000, .evs.onopen = &onopen, .evs.onclose = &cerrar, .evs.onmessage = &onmessage});return (0); }
El ejemplo anterior se puede construir con: make examples
.
Dentro de extra/toyws
hay un proyecto complementario llamado ToyWS. ToyWS es un cliente WebSocket muy simple y tonto creado exclusivamente para funcionar con wsServer. Extremadamente limitado, se desaconseja su uso con otros servidores que no sean wsServer y solo debe usarse junto con wsServer.
Este miniproyecto sólo sirve como ayuda para wsServer y libera al usuario de utilizar proyectos adicionales para utilizar wsServer en su totalidad.
Más información en: extra/toyws/README.md
Actualmente, wsServer no admite el cifrado. Sin embargo, es posible utilizarlo junto con Stunnel, un proxy que agrega soporte TLS a proyectos existentes. Simplemente siga estos cuatro sencillos pasos para obtener soporte TLS en wsServer.
wsServer siempre está abierto a la comunidad y dispuesto a aceptar contribuciones, ya sea con problemas, documentación, pruebas, nuevas funciones, correcciones de errores, errores tipográficos... bienvenido a bordo. Asegúrese de leer las pautas de estilo de codificación antes de enviar un PR.
¿Te resultó útil el proyecto? ¿Tienes algo que decir al respecto? Deja tus comentarios aquí.
wsServer tiene la licencia GPLv3. Escrito por Davidson Francis y otros colaboradores.