wsServer – eine sehr kleine WebSocket-Serverbibliothek, geschrieben in C
wsServer ist eine kleine, leichte WebSocket-Serverbibliothek, die in C geschrieben ist und benutzerfreundlich, schnell, hackbar und RFC 6455-konform sein soll.
Die Hauptmerkmale sind:
Senden/Empfangen von Text- und Binärnachrichten
PING/PONG-Rahmen
Eröffnungs-/Abschlusshandschlag
Ereignisbasiert (onmessage, onopen, onclose)
Portabilität: Funktioniert gut unter Windows, Linux (einschließlich Android), macOS und FreeBSD
Eine ausführliche Analyse finden Sie im Autobahn-Bericht und in den Dokumenten.
wsServer erfordert lediglich einen C99-kompatiblen Compiler (wie GCC, Clang, TCC und andere) und keine externen Bibliotheken.
Die bevorzugte Methode zum Erstellen von wsServer in Linux-Umgebungen:
Git-Klon https://github.com/Theldus/wsServercd wsServer/ make# Optional kann ein Benutzer wsServer auch im System installieren,# entweder über Standardpfade oder durch Bereitstellung von PREFIX- oder DESTDIR-Umgebungsvariablen für die Makefile.make-Installation # Oder make install DESTDIR=/my/folder/
CMake ermöglicht dem Benutzer die einfache Erstellung von wsServer in anderen Umgebungen als Linux und ermöglicht außerdem die Verwendung einer IDE zum automatischen Erstellen des Projekts. Wenn das bei Ihnen der Fall ist:
Git-Klon https://github.com/Theldus/wsServercd wsServer/ mkdir build && cd build/ cmake .. machen ./examples/echo/echo # Warten auf eingehende Verbindungen ...
Windows verfügt über native Unterstützung über MinGW. Die Einrichtung der Toolchain und die Erstellungsschritte werden hier detailliert beschrieben.
wsServer vereinfacht die Socket-Verwaltung, indem es Ihnen ermöglicht, sich auf nur drei verschiedene Arten von Ereignissen zu konzentrieren:
/* Neuer Kunde. */void onopen(ws_cli_conn_t client);/* Client getrennt. */void onclose(ws_cli_conn_t client);/* Der Client hat eine Textnachricht gesendet. */void onmessage(ws_cli_conn_t client, const unsigned char *msg,uint64_t size, int type);
Das ist das Einzige, worüber Sie sich Sorgen machen müssen. Sie müssen nicht über Rückgabewerte im Socket, das Akzeptieren von Verbindungen oder irgendetwas anderes nachdenken. Als Bonus wird jeder Kunde in einem separaten Thread behandelt, sodass Sie sich auch darüber keine Sorgen machen müssen.
Weitere Beispiele, einschließlich der entsprechenden HTML-Dateien, finden Sie im Ordner „examples/“ ;-).
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ws.h>/** * @brief Diese Funktion wird immer dann aufgerufen, wenn eine neue Verbindung geöffnet wird. * @param client Client-Verbindung. */void onopen(ws_cli_conn_t client) {char *cli;cli = ws_getaddress(client);printf("Verbindung geöffnet, Adresse: %sn", cli); }/** * @brief Diese Funktion wird immer dann aufgerufen, wenn eine Verbindung geschlossen wird. * @param client Client-Verbindung. */void onclose(ws_cli_conn_t client) {char *cli;cli = ws_getaddress(client);printf("Verbindung geschlossen, Adresse: %sn", cli); }/** * @brief Message events geht hierher. * @param client Client-Verbindung. * @param msg Nachrichteninhalt. * @param size Nachrichtengröße. * @param Typ Nachrichtentyp. */void onmessage(ws_cli_conn_t client,const unsigned char *msg, uint64_t size, int type) {char *cli;cli = ws_getaddress(client);printf("Ich erhalte eine Nachricht: %s (%zu), von: %sn", msg,size, cli);sleep(2);ws_sendframe_txt(client, " hallo");sleep(2);ws_sendframe_txt(client, "world"); }int main(void) {/* * Hauptschleife, diese Funktion kehrt nie* zurück. * * *Wenn .thread_loop != 0 ist, wird ein neuer Thread erstellt, um neue Verbindungen zu verarbeiten, und ws_socket() wird nicht blockierend. */ws_socket(&(struct ws_server){/* * Host binden, wie zum Beispiel: * localhost -> localhost/127.0.0.1 * 0.0.0.0 -> globales IPv4 * :: -> globales IPv4+IPv6 (Dual Stack) * /.host = "localhost", .port = 8080, .thread_loop = 0, .timeout_ms = 1000, .evs.onopen = &onopen, .evs.onclose = &onclose, .evs.onmessage = &onmessage});return (0); }
Das obige Beispiel kann erstellt werden mit: make examples
.
Innerhalb von extra/toyws
gibt es ein Begleitprojekt namens ToyWS. ToyWS ist ein sehr einfacher und dummer WebSocket-Client, der ausschließlich für die Zusammenarbeit mit wsServer entwickelt wurde. Da es äußerst eingeschränkt ist, wird von der Verwendung mit anderen Servern als wsServer dringend abgeraten und es ist nur für die Verwendung in Verbindung mit wsServer vorgesehen.
Dieses Miniprojekt dient lediglich als Hilfsmittel für wsServer und befreit den Benutzer von der Verwendung zusätzlicher Projekte, um wsServer in vollem Umfang nutzen zu können.
Weitere Informationen unter: extra/toyws/README.md
wsServer unterstützt derzeit keine Verschlüsselung. Es ist jedoch möglich, es in Verbindung mit Stunnel zu verwenden, einem Proxy, der bestehenden Projekten TLS-Unterstützung hinzufügt. Befolgen Sie einfach diese vier einfachen Schritte, um TLS-Unterstützung auf wsServer zu erhalten.
wsServer ist immer offen für die Community und bereit, Beiträge anzunehmen, sei es bei Problemen, Dokumentation, Tests, neuen Funktionen, Bugfixes, Tippfehlern ... willkommen an Bord. Lesen Sie unbedingt die Richtlinien zum Codierungsstil, bevor Sie eine PR senden.
Hat Ihnen das Projekt geholfen? Haben Sie etwas dazu zu sagen? Hinterlassen Sie hier Ihre Kommentare.
wsServer ist unter der GPLv3-Lizenz lizenziert. Geschrieben von Davidson Francis und anderen Mitwirkenden.