wsServer - une toute petite bibliothèque de serveur WebSocket écrite en C
wsServer est une petite bibliothèque de serveur WebSocket légère écrite en C qui se veut facile à utiliser, rapide, piratable et conforme à la RFC 6455.
Les principales caractéristiques sont :
Envoyer/recevoir des messages texte et binaires
Cadres PING/PONG
Poignées de main d’ouverture/fermeture
Basé sur un événement (onmessage, onopen, onclose)
Portabilité : fonctionne bien sous Windows, Linux (Android inclus), macOS et FreeBSD
Voir le rapport Autobahn et la documentation pour une analyse « approfondie ».
wsServer nécessite uniquement un compilateur compatible C99 (tel que GCC, Clang, TCC et autres) et aucune bibliothèque externe.
La méthode préférée pour créer wsServer sur des environnements Linux :
git clone https://github.com/Theldus/wsServercd wsServer/ make# Facultativement, un utilisateur peut également installer wsServer dans le système,# soit sur les chemins par défaut, soit en fournissant les variables d'environnement PREFIX ou DESTDIR à l'installation Makefile.make # Ou make install DESTDIR=/my/folder/
CMake permet à l'utilisateur de créer facilement wsServer dans d'autres environnements autres que Linux et permet également l'utilisation d'un IDE pour créer automatiquement le projet. Si c'est votre cas :
git clone https://github.com/Theldus/wsServercd wsServer/ mkdir build && cd build/ cmfaire .. faire ./examples/echo/echo # En attente des connexions entrantes...
Windows dispose d'un support natif via MinGW, la configuration de la chaîne d'outils et les étapes de construction sont détaillées ici.
wsServer simplifie la gestion des sockets en vous permettant de vous concentrer uniquement sur trois types d'événements différents :
/* Nouveau client. */void onopen(ws_cli_conn_t client);/* Client déconnecté. */void onclose(ws_cli_conn_t client);/* Le client a envoyé un message texte. */void onmessage (client ws_cli_conn_t, const char non signé *msg, taille uint64_t, type int) ;
C'est la seule chose dont vous devez vous soucier. Vous n'avez pas à penser aux valeurs de retour dans le socket, à l'acceptation des connexions ou à toute autre chose. En prime, chaque client est géré dans un thread séparé, vous n'avez donc pas à vous en soucier non plus.
D'autres exemples, y compris leurs fichiers HTML respectifs, peuvent être trouvés dans le dossier examples/, ;-).
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ws.h>/** * @brief Cette fonction est appelée chaque fois qu'une nouvelle connexion est ouverte. * @param client Connexion client. */void onopen (client ws_cli_conn_t) {char *cli;cli = ws_getaddress(client);printf("Connexion ouverte, adresse : %sn", cli); }/** * @brief Cette fonction est appelée chaque fois qu'une connexion est fermée. * @param client Connexion client. */void onclose (client ws_cli_conn_t) {char *cli;cli = ws_getaddress(client);printf("Connexion fermée, adresse : %sn", cli); }/** * Les événements de message @brief vont ici. * @param client Connexion client. * @param msg Contenu du message. * @param size Taille du message. * @param type Type de message. */void onmessage (client ws_cli_conn_t, caractère const non signé *msg, taille uint64_t, type int) {char *cli;cli = ws_getaddress(client);printf("Je reçois un message : %s (%zu), de : %sn", msg,size, cli);sleep(2);ws_sendframe_txt(client, " bonjour");sleep(2);ws_sendframe_txt(client, "world"); }int principal (vide) {/* * Boucle principale, cette fonction ne renvoie jamais*. * * *Si le .thread_loop vaut != 0, un nouveau thread est créé * pour gérer les nouvelles connexions et ws_socket() devient * non bloquant. */ws_socket(&(struct ws_server){/* * Lier l'hôte, tel que : * localhost -> localhost/127.0.0.1 * 0.0.0.0 -> global IPv4 * :: -> global IPv4+IPv6 (double pile) * /.host = "localhost", .port = 8080, .thread_loop = 0, .timeout_ms = 1000, .evs.onopen = &onopen, .evs.onclose = &onclose, .evs.onmessage = &onmessage});retour (0); }
l'exemple ci-dessus peut être construit avec : make examples
.
Dans extra/toyws
il existe un projet compagnon appelé ToyWS. ToyWS est un client WebSocket très simple et stupide conçu exclusivement pour fonctionner avec wsServer. Extrêmement limitée, son utilisation est fortement déconseillée avec d'autres serveurs que wsServer et est uniquement destinée à être utilisée conjointement avec wsServer.
Ce mini-projet sert uniquement d'aide à wsServer et libère l'utilisateur de l'utilisation de projets supplémentaires pour utiliser wsServer dans son intégralité.
Plus d'informations sur : extra/toyws/README.md
wsServer ne prend actuellement pas en charge le chiffrement. Cependant, il est possible de l'utiliser conjointement avec Stunnel, un proxy qui ajoute le support TLS aux projets existants. Suivez simplement ces quatre étapes simples pour obtenir la prise en charge de TLS sur wsServer.
wsServer est toujours ouvert à la communauté et disposé à accepter des contributions, qu'il s'agisse de problèmes, de documentation, de tests, de nouvelles fonctionnalités, de corrections de bugs, de fautes de frappe... bienvenue à bord. Assurez-vous de lire les directives de style de codage avant d'envoyer un PR.
Le projet vous a-t-il été utile ? Avez-vous quelque chose à dire à ce sujet ? Laissez vos commentaires ici.
wsServer est sous licence GPLv3. Écrit par Davidson Francis et d'autres contributeurs.