# 基于libevent的websocket **Repository Path**: public-rtos/src ## Basic Information - **Project Name**: 基于libevent的websocket - **Description**: libevent不支持websocket,强行改代码的话,对于以后升级libevent是个麻烦。本软件在libevent自带的http服务基础上,实现websocket。也可以用https实现wss - **Primary Language**: C - **License**: 0BSD - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-08-05 - **Last Updated**: 2025-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: libevent, WebSocket, Http, https ## README # 基于libevent的websocket #### 介绍 libevent不支持websocket,强行改代码的话,对于以后升级libevent是个麻烦。本软件在libevent自带的http服务基础上,实现websocket。也可以用https实现wss #### 软件架构 在windows的mingw下面编译通过,使用良好,编译器是64位的GCC,在linux的32位嵌入式系统上编译通过,运行良好,编译器是gcc 本库完全在libevent的http协议基础上实现,对websocket文档里面的定义和标准90%的全都支持。 服务器端工作原理: 接收全客户端的http请求之后,在回调里面判断http头,对: 1. Connection的Upgrade进行判断, 2.webwocket升级请求进行判断, 3.对websocket版本进行判断, 全部通过则进行回调用户的conn函数,该函数会产生一个libws_t的结构体,应用层的初始化可以在这个回调进行初始化。如果返回空,则会断开客户端连接,认为服务器拒绝接入 新的libws_t则可以调用libws_send发送数据,收到数据会产生接收回调,在创建libws_t结构体时的接收回调里面进行处理 客户端工作原理: libws_connect链接服务器并指定接收、发送、接入、关闭4个回调函数,在相应的地方进行调用。 该函数调用了标准的libevent的http客户端进行通讯。 libevent默认的http服务器和客户端都是有默认超时设定,websocket在成功接入后,则自动屏蔽超时和其他回调,将产生的http connection数据处理和回调全部屏蔽,将connection设置为keep-alive状态,使用该connection的bufferevent进行通讯。 libws的客户端发送数据采用掩码发送,服务器发送数据不掩码,客户端和服务器的接收都可以识别是否掩码。 如果编译不通过,将日志打印改为用户项目中自己的打印,将get_fms函数定义为获取毫秒的函数即可。 注意get_fms函数,一定要采用相对时间,不能采用系统时间,因为系统时间一旦调整,会影响libws的超时判断。 本人在使用时采用了CLOCK_MONOTONIC进行获取相对时间,该时间一般是从系统启动开始计数,无论何种情况都不会清零和修改,只会按时间增量增加,用于软件的超时判断最合适不过。 sha1和base64是websocket在握手时的必须库,直接添加到工程即可。 #### 安装教程 直接加入工程并编译即可。 #### 使用说明 按照头文件调用函数 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/public-rtos/src](https://gitee.com/public-rtos/src) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)