
Unix/Linux 编程:网络编程之 基于Reactor实现WebSocket服务
接收回调函数:处理新连接的接收事件。 发送回调函数:处理数据发送事件。 握手处理:完成 WebSocket 握手,建立通信通道。 数据处理:解析和加密/解密 WebSocket 数据帧。
发布日期:2021-05-07 23:34:49
浏览次数:22
分类:精选文章
本文共 3000 字,大约阅读时间需要 10 分钟。
基于epoll的WebSocket服务器实现
环境搭建
首先,需要安装OpenSSL库。以下是安装步骤:
tar xzvf OpenSSL-1.1.0l.tar.gzcd OpenSSL-1.1.0l./config --prefix=/usr/local/opensslmakesudo make install
安装完成后,需将OpenSSL的头文件和库文件添加到系统的路径中。可以通过修改/etc/profile
文件来实现:
sudo vim /etc/profile
在文件末尾加入以下内容并保存:
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH export PATH=/usr/local/openssl/bin:$PATH
重新登录终端后,gcc编译将自动识别OpenSSL的路径。
项目结构
项目文件结构如下:
.├── websocket_server.c├── Makefile├── README.md└── include ├── epoll.h ├── socket.h └── stdio.h
WebSocket协议简介
WebSocket是一种基于HTTP协议的双向通信协议,适用于实时数据传输。其特点包括:
- 握手阶段:通过HTTP协议建立连接。
- 数据传输:握手完成后可双向传输自定义数据。
- 数据帧: WebSocket协议使用数据帧(frames)进行数据传输,每个帧包含方向标识、长度信息和实际数据。
WebSocket服务器实现
服务器基于epoll反应模型,结合OpenSSL的加密库,实现WebSocket协议的服务器端。
代码解析
#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUFFER_LENGTH 1024 #define EVENT_SIZE 1024 #define GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" enum WS_STATUS { WS_INIT = 0, WS_HANDSHAKE = 1, WS_DATATRANSFORM = 2, WS_DATAEND }; struct sockitem { int sockfd; int (*callback)(int events, void* arg); char recvbuffer[BUFFER_LENGTH]; char sendbuffer[BUFFER_LENGTH]; int rlength; // 收到的数据长度 int slength; // 要发送的数据长度 int status; }; struct reactor { int epollfd; struct epoll_event events[EVENT_SIZE]; }; struct _websocket_ophdr { unsigned char opcode:4; unsigned char rsv3:1; unsigned char rsv2:1; unsigned char rsv1:1; unsigned char fin:1; unsigned char payload_length:7; unsigned char mask:1; } __attribute__((packed)); struct _websocket_head_126 { unsigned short payload_length; char mask_key[4]; unsigned char data[8]; } __attribute__((packed)); struct _websocket_head_127 { unsigned long long payload_length; char mask_key[4]; unsigned char data[8]; } __attribute__((packed)); typedef struct _websocket_head_127 websocket_head_127; typedef struct _websocket_head_126 websocket_head_126; typedef struct _websocket_ophdr ophdr; struct reactor *g_eventloop = NULL;
功能模块
安装与运行
编译命令如下:
gcc -I /usr/local/openssl/include -L /usr/local/openssl/lib websocket_server.c -o websocket_server -lcrypto
运行服务器:
./websocket_server 8080
测试客户端
客户端代码示例如下:
int main(int argc, char* argv) { // 客户端连接代码 // ... ws_client Connect(const char* url) { // 实现WS连接逻辑 // ... } // 进行WS握手 int ret = Connect("ws://localhost:8080"); if (ret != 0) { printf("连接失败\n"); return; } // 发送数据 char buffer[1024]; int len = 0; while (true) { printf("请输入数据:"); scanf("%s", buffer, sizeof(buffer)); ret = Send(buffer, sizeof(buffer)); if (ret < 0) { printf("发送失败\n"); break; } printf("发送成功\n"); }}
服务器端运行
服务器启动后,等待客户端连接。客户端建立连接后,服务器触发接收回调函数,完成WS握手流程。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年05月05日 02时00分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ELK学习笔记(三)单台服务器多节点部署
2025-03-29
ELK应用日志收集实战
2025-03-29
elTable火狐浏览器换行
2025-03-29
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
2025-03-29
100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了
2025-03-29
10个程序员可以接私活的平台
2025-03-29
10条sql语句优化的建议
2025-03-29
10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了!
2025-03-29
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了
2025-03-29
15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了!
2025-03-29
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了!
2025-03-29
1分钟学会在Linux下模拟网络延迟
2025-03-29
200款免费的AI工具汇总
2025-03-29
2023年失业的你明白了什么道理?
2025-03-29
2023应届毕业生找不到工作很焦虑怎么办?
2025-03-29