wsServer - 一個用 C 寫的非常小的 WebSocket 伺服器庫
wsServer 是一個用 C 語言編寫的小型輕量級 WebSocket 伺服器庫,旨在易於使用、快速、可破解且符合 RFC 6455。
主要特點是:
發送/接收文字和二進位訊息
PING/PONG 框架
開場/閉場握手
基於事件(onmessage、onopen、onclose)
可攜性:在 Windows、Linux(包括 Android)、macOS 和 FreeBSD 上運作良好
請參閱 Autobahn 報告和文件以進行「深入」分析。
wsServer 僅需要 C99 相容的編譯器(例如 GCC、Clang、TCC 等),無需外部函式庫。
在Linux環境下建置wsServer的首選方式:
git 克隆 https://github.com/Theldus/wsServercd wsServer/ make# 或者,使用者也可以將 wsServer 安裝到系統中,# 或在預設路徑上,或透過向 Makefile 提供 PREFIX 或 DESTDIR env# vars。
CMake 使用戶能夠在 Linux 以外的其他環境中輕鬆建置 wsServer,並且還允許使用 IDE 自動建置專案。如果這是你的情況:
git 克隆 https://github.com/Theldus/wsServercd wsServer/ mkdir 構建 && cd 構建/ .. 製作 ./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 類型);
這是您唯一需要擔心的事情。您不必考慮套接字中的回傳值、接受連線或其他任何事情。作為獎勵,每個客戶端都在單獨的線程中處理,因此也無需擔心這一點。
更多範例,包括各自的 html 文件,可以在範例/資料夾中找到;-)。
#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 client,const unsigned char *msg, uint64_t 大小, int 類型) {char *cli;cli = ws_getaddress(client);printf("我收到訊息:%s (%zu),來自:%sn", msg,size, cli);sleep(2);ws_sendframe_txt(client, "你好”);睡眠(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});返回(0); }
上面的範例可以使用以下指令建構: make examples
。
extra/toyws
內部有一個名為 ToyWS 的配套專案。 ToyWS 是一個非常簡單且愚蠢的 WebSocket 用戶端,專為與 wsServer 一起使用而設計。極其有限,強烈建議不要與 wsServer 以外的其他伺服器一起使用,並且只能與 wsServer 結合使用。
這個迷你項目僅作為wsServer的輔助,使用戶免於使用額外的項目來完整地使用wsServer。
更多資訊請造訪:extra/toyws/README.md
wsServer 目前不支援加密。但是,可以將其與 Stunnel 結合使用,Stunnel 是一個為現有專案添加 TLS 支援的代理程式。只需按照以下四個簡單步驟即可在 wsServer 上獲得 TLS 支援。
wsServer 始終向社區開放,並願意接受貢獻,無論是問題、文件、測試、新功能、錯誤修復、拼寫錯誤......歡迎加入。在發送 PR 之前,請務必閱讀編碼風格指南。
該項目對您有幫助嗎?對此有什麼話要說嗎?在這裡留下您的評論。
wsServer 根據 GPLv3 授權取得許可。由戴維森·弗朗西斯和其他貢獻者撰寫。