C 实现 WebSocket 服务器

news/2024/9/24 23:27:12/

目录

一、概述

C%E3%80%81%E5%9F%BA%E6%9C%AC%E7%89%B9%E5%BE%81-toc" style="margin-left:0px;">二、基本特征

三、使用案例

1、客户端 HTML 代码

C%8D%E5%8A%A1%E7%AB%AF%20C%20%E4%BB%A3%E7%A0%81-toc" style="margin-left:40px;">2、服务端 C 代码

C%E7%BB%93%E6%9E%9C-toc" style="margin-left:0px;">四、运行结果


一、概述

        实现 WebSocket 服务器主要参考 RFC 协议。链接如下:

RFC 6455: The WebSocket Protocol (rfc-editor.org)CsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://www.rfc-editor.org/rfc/rfc6455.html       具体的实现思路:

        1、实现一个典型的 TCP 服务器。

        2、CPFuWuQi.html" title=TCP服务器>TCP服务器处理客户端请求时,依据上述文档描述,分三个阶段处理 WS Client 请求(握手阶段、传输阶段、分手阶段)。

        详细代码已上传到 gitcode和github。

项目目录预览 - ws_server - GitCodeCsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://gitcode.com/qq_37437983/ws_server/tree/mainAtaoistPriest/ws_server: This is a web socket server implemented with C. (github.com)CsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://github.com/AtaoistPriest/ws_server

C%E3%80%81%E5%9F%BA%E6%9C%AC%E7%89%B9%E5%BE%81">二、基本特征

1、指定服务器 IP 、Port 和 transmission 阶段的消息回调函数后即可快速启动服务器。

2、内置轻量级日志打印器。

三、使用案例

1、客户端 HTML 代码

<html>
<head><script>let ws;function doConnect(addr) {ws = new WebSocket("ws://" + addr);ws.onopen = () => {document.getElementById("log").value += (" Connection opened\n");};ws.onmessage = (event) => {document.getElementById("log").value += (" Receive: " + event.data + "\n\n"); // JSON.stringify()};ws.onclose = () => {document.getElementById("log").value += (" Connection closed\n");};}function doClose(addr) {ws.close();}document.addEventListener("DOMContentLoaded", (event) => {document.getElementById("btn_open_connect").onclick = () => {let server_addr = document.getElementById("server_addr").value;doConnect(server_addr);};document.getElementById("btn_close_connect").onclick = () => {doClose();document.getElementById("log").value += (" Client Close Connection\n");};document.getElementById("btn_send").onclick = () => {let msg = document.getElementById("message").value;ws.send(msg);document.getElementById("log").value += (" Send: " + msg + "\n");};document.getElementById("btn_clear").onclick = () => {document.getElementById("log").value = ("");};});</script>
</head>
<body><div id="header"><h1 align="left">WebSocket Client</h1>Server: <input id="server_addr" type="text" value="39.105.122.85:52323"><input id="btn_open_connect" type="button" value="Connect"><input id="btn_close_connect" type="button" value="DisConnect"><br/><br/>Message: <input id="message" type="text" value=""><input id="btn_send" type="button" value="Send"><input id="btn_clear" type="button" value="Clear"><br/><br/><textarea cols="250" id="log" rows="50"></textarea>
</div>
</body>
</html>

C%8D%E5%8A%A1%E7%AB%AF%20C%20%E4%BB%A3%E7%A0%81">2、服务端 C 代码

#include "./src/wbsocket_server.h"long msg_switch(unsigned char *req, long req_len, unsigned char *res, long res_len)
{bzero(res, res_len);long len = sprintf((char *)res, "Recv %s Successfully", req);return len;
}void test_ws_server()
{logger_init("./log");start_server("172.17.83.59", "52323", msg_switch);logger_destroy();
}int main(void)
{test_ws_server();return 0;
}

C%E7%BB%93%E6%9E%9C">四、运行结果

        下图是 Web Socket 客户端连接 Web Socket 服务器的通讯过程,包括了连接、请求回复与断开连接。


http://www.ppmy.cn/news/1464182.html

相关文章

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

typedef 和 using 区别

typedef 和 using 都可以用于定义一个新类型。typedef 用于c语言中&#xff0c;被c继承&#xff0c;目的是为已存在的类型创建一个别名。 typedef 用法 typedef old_type new_type 例如&#xff1a; typedef int Integer; typedef std::vector<int> IntVector; typed…

【放球问题 乘法原理 唯一分解定理】1735. 生成乘积数组的方案数

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 乘法原理 唯一分解定理 本题同解 【唯一分解定理】【动态规划】【前缀和】1735生成乘积数组的方案数 LeetCode 1735. 生成乘积数组的方案数 给你一个二维整数数组 queries &#xff0c;其中 queries[i] [ni, ki] 。…

GB报文中的Cseq值的注意点

一、 问题现象 【问题现象】NVR使用GB接三方平台发现倍速回放时&#xff0c; 【现场拓扑】现场拓扑如下 &#xff08;1&#xff09; NVR侧使用家用宽带的方式&#xff0c;通过国标跨公网接入三方平台。 图1.1&#xff1a;网络拓扑 二、 抓包分析 INVITE sip:420000004013200…

Java 读取 xml 文件的五种方式

在编写与 XML 数据交互的现代软件应用时&#xff0c;有效地读取和解析 XML 文件是至关重要的。XML&#xff08;可扩展标记语言&#xff09;因其灵活性和自我描述性&#xff0c;已成为数据存储和传输的一种普遍格式。对于 Java 开发者来说&#xff0c;Java 提供了多种工具和库来…

JavaScript 模板字符串

JavaScript 模板字符串是一种允许在字符串中嵌入表达式的特殊字符串语法。它们以反引号&#xff08;&#xff09;包围&#xff0c;并使用${}符号来表示需要插入的表达式。 模板字符串可以包含任何有效的 JavaScript 表达式&#xff0c;包括变量、函数调用、算术运算等。在插入…

用香橙派AIpro部署大模型、安装宝塔搭建私有随身WEB开发环境

什么是香橙派 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板&#xff0c;其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算&#xff0c;可广泛…

MySQL 使用 binlog 找回已删除数据

背景&#xff1a;使用 delete 删除数据少添加了条件 mysqlbinlog --base64-outputdecode-rows -v --start-datetime"2024-05-27 11:48:48" --stop-datetime"2024-05-27 12:59:52" binlog文件 > 转后sql 使用其他方式&#xff0c;转换的SQL并没有sql语…