Unix/Linux 编程:网络编程之 基于Reactor实现WebSocket服务
发布日期:2021-05-07 23:34:49 浏览次数:22 分类:精选文章

本文共 3000 字,大约阅读时间需要 10 分钟。

基于epoll的WebSocket服务器实现

环境搭建

首先,需要安装OpenSSL库。以下是安装步骤:

tar xzvf OpenSSL-1.1.0l.tar.gz
cd OpenSSL-1.1.0l
./config --prefix=/usr/local/openssl
make
sudo 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;

功能模块

  • 接收回调函数:处理新连接的接收事件。
  • 发送回调函数:处理数据发送事件。
  • 握手处理:完成 WebSocket 握手,建立通信通道。
  • 数据处理:解析和加密/解密 WebSocket 数据帧。
  • 安装与运行

    编译命令如下:

    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握手流程。

    上一篇:Unix/Linux 编程:网络编程之 线程池
    下一篇:Unix/Linux 编程:网络编程之 epoll与Reactor

    发表评论

    最新留言

    关注你微信了!
    [***.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
    2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力! 2025-03-29
    2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2025-03-29
    0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏) 2025-03-29
    100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了 2025-03-29
    10个程序员可以接私活的平台 2025-03-29
    10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了 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