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。make install # 或者 make install DESTDIR=/my/folder/
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 许可证获得许可。由戴维森·弗朗西斯和其他贡献者撰写。