wsServer — очень маленькая серверная библиотека WebSocket, написанная на C.
wsServer — это крошечная и легкая серверная библиотека WebSocket, написанная на C, которая должна быть простой в использовании, быстрой, взломанной и совместимой с RFC 6455.
Основные особенности:
Отправка/получение текстовых и двоичных сообщений
Рамки для ПИНГ/ПОНГ
Открытие/закрытие рукопожатий
На основе событий (onmessage, onopen, onclose)
Портативность: отлично работает в Windows, Linux (включая Android), macOS и FreeBSD.
См. отчет об автобане и документацию для «углубленного» анализа.
wsServer требует только C99-совместимого компилятора (например, GCC, Clang, TCC и других) и никаких внешних библиотек.
Предпочтительный способ сборки wsServer в средах Linux:
git клон https://github.com/Theldus/wsServercd wsServer/ make# При желании пользователь также может установить wsServer в систему # либо по путям по умолчанию, либо указав переменные env# PREFIX или DESTDIR в файле Makefile.make install # Или make install DESTDIR=/my/folder/
CMake позволяет пользователю легко собирать wsServer в других средах, отличных от Linux, а также позволяет использовать IDE для автоматической сборки проекта. Если это ваш случай:
git клон https://github.com/Theldus/wsServercd wsServer/ mkdir build && cd build/ сделай .. делать ./examples/echo/echo # Ожидание входящих соединений...
Windows имеет встроенную поддержку через MinGW, шаги по настройке и сборке набора инструментов подробно описаны здесь.
wsServer упрощает управление сокетами, позволяя вам сосредоточиться только на трех различных типах событий:
/* Новый клиент. */void onopen(ws_cli_conn_t client);/* Клиент отключен. */void onclose(ws_cli_conn_t client);/* Клиент отправил текстовое сообщение. */void onmessage(ws_cli_conn_t client, const unsigned char *msg, uint64_t size, int type);
Это единственное, о чем вам нужно беспокоиться. Вам не нужно думать о возвращаемых значениях в сокете, принятии соединений или чем-то еще. В качестве бонуса каждый клиент обрабатывается в отдельном потоке, так что об этом тоже не стоит беспокоиться.
Дополнительные примеры, включая соответствующие html-файлы, можно найти в папке example/, ;-).
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ws.h>/** * @brief Эта функция вызывается всякий раз, когда открывается новое соединение. * @param client Клиентское соединение. */void onopen (клиент ws_cli_conn_t) {char *cli;cli = ws_getaddress(client);printf("Соединение открыто, адрес: %sn", cli); }/** * @brief Эта функция вызывается всякий раз, когда соединение закрывается. * @param client Клиентское соединение. */void onclose (клиент ws_cli_conn_t) {char *cli;cli = ws_getaddress(client);printf("Соединение закрыто, адрес: %sn", cli); }/** * @brief События сообщений находятся здесь. * @param client Клиентское соединение. * @param msg Содержимое сообщения. * @param size Размер сообщения. * @param type Тип сообщения. */void onmessage (клиент ws_cli_conn_t, const беззнаковый символ *msg, размер uint64_t, тип int) {char *cli;cli = ws_getaddress(client);printf("Я получил сообщение: %s (%zu), от: %sn", msg,size, cli);sleep(2);ws_sendframe_txt(client, " привет");sleep(2);ws_sendframe_txt(клиент, "мир"); }int main (недействительный) {/* * Основной цикл, эта функция никогда* не возвращает результат. * * *Если .thread_loop равен != 0, создается новый поток * для обработки новых соединений, и ws_socket() становится * неблокирующим. */ws_socket(&(struct ws_server){/* * Привяжите хост, например: * localhost -> localhost/127.0.0.1 * 0.0.0.0 -> глобальный IPv4 * :: -> глобальный IPv4+IPv6 (двойной стек) * /.host = "локальный хост", .порт = 8080, .thread_loop = 0, .timeout_ms = 1000, .evs.onopen = &onopen, .evs.onclose = &onclose, .evs.onmessage = &onmessage});return (0); }
приведенный выше пример можно построить с помощью: make examples
.
Внутри extra/toyws
есть сопутствующий проект ToyWS. ToyWS — очень простой и глупый клиент WebSocket, созданный исключительно для работы с wsServer. Крайне ограничено, его использование крайне не рекомендуется с другими серверами, кроме wsServer, и предназначено только для использования вместе с wsServer.
Этот мини-проект служит лишь вспомогательным средством wsServer и освобождает пользователя от использования дополнительных проектов для полного использования wsServer.
Дополнительная информация: extra/toyws/README.md.
wsServer в настоящее время не поддерживает шифрование. Однако его можно использовать вместе со Stunnel — прокси-сервером, который добавляет поддержку TLS в существующие проекты. Просто выполните эти четыре простых шага, чтобы получить поддержку TLS на wsServer.
wsServer всегда открыт для сообщества и готов принять вклад, будь то проблемы, документация, тестирование, новые функции, исправления ошибок, опечатки... добро пожаловать на борт. Обязательно прочтите рекомендации по стилю кодирования перед отправкой PR.
Был ли проект полезен для вас? Есть что сказать по этому поводу? Оставляйте свои комментарии здесь.
wsServer распространяется по лицензии GPLv3. Написано Дэвидсоном Фрэнсисом и другими участниками.