C基础7.16第四次作业

5:

6:

7:

8:

9:

10:

11:

11:

在 **C 语言** 中使用 **Mongoose 7.16** 版本编写一个 **WebSocket 服务端** 是非常常见的需求,尤其适用于嵌入式系统、物联网通信、实时数据传输等场景。 下面是一个完整的 **WebSocket 服务端示例程序**,使用 Mongoose 7.16 版本实现: --- ## ✅ 示例目标 - 启动 WebSocket 服务监听 `ws://0.0.0.0:8080/ws` - 支持客户端连接 - 接收客户端发送的文本消息 - 将消息原样返回给客户端(Echo 服务) - 支持多个客户端连接(简单管理) --- ## 🧩 示例代码(`websocket_server.c`) ```c #include "mongoose.h" #include <stdio.h> #include <stdlib.h> #include <string.h> // WebSocket 事件处理函数 static void ws_handler(struct mg_connection *nc, int ev, void *ev_data, void *fn_data) { if (ev == MG_EV_OPEN) { printf("Client connected\n"); } else if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *hm = (struct mg_http_message *)ev_data; if (mg_match(hm->uri, mg_str("/ws"), NULL)) { // 升级为 WebSocket printf("Upgrading to WebSocket\n"); mg_ws_upgrade(nc, hm, NULL); } else { // 返回 404 mg_http_reply(nc, 404, "", "Not found"); } } else if (ev == MG_EV_WS_MSG) { struct mg_ws_message *wm = (struct mg_ws_message *)ev_data; char *data = (char *)malloc(wm->data.len + 1); if (data != NULL) { memcpy(data, wm->data.ptr, wm->data.len); data[wm->data.len] = '\0'; // 确保字符串结尾 printf("Received: %s\n", data); // Echo 回复 mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, data, wm->data.len); free(data); } } else if (ev == MG_EV_CLOSE) { printf("Client disconnected\n"); } } int main(void) { struct mg_mgr mgr; struct mg_connection *nc; // 初始化 Mongoose 管理器 mg_mgr_init(&mgr); // 创建监听连接 nc = mg_bind(&mgr, "8080", ws_handler, NULL); if (nc == NULL) { printf("Failed to bind to port 8080\n"); return 1; } // 设置 HTTP 和 WebSocket 协议 mg_set_protocol_http_websocket(nc); printf("WebSocket server started on ws://0.0.0.0:8080/ws\n"); // 主事件循环 while (1) { mg_mgr_poll(&mgr, 1000); } // 清理资源(不会执行到这里) mg_mgr_free(&mgr); return 0; } ``` --- ## 📦 编译与运行(Linux/macOS) 确保你已经将 `mongoose.c` 和 `mongoose.h` 放入项目目录中。 ```bash gcc -o websocket_server websocket_server.c mongoose.c -lpthread ./websocket_server ``` --- ## 🌐 浏览器测试方式(WebSocket 客户端) 你可以使用浏览器控制台进行测试: ```html <script> const ws = new WebSocket("ws://localhost:8080/ws"); ws.onopen = function() { console.log("Connected to WebSocket server"); ws.send("Hello from browser!"); }; ws.onmessage = function(event) { console.log("Received from server:", event.data); }; </script> ``` --- ## 📌 说明 | 事件 | 说明 | |------|------| | `MG_EV_OPEN` | 新连接建立 | | `MG_EV_HTTP_MSG` | 处理 HTTP 请求并升级为 WebSocket | | `MG_EV_WS_MSG` | 接收到 WebSocket 消息 | | `MG_EV_CLOSE` | 客户端断开连接 | --- ## ✅ 进阶功能建议 你可以在此基础上扩展以下功能: - ✅ 消息广播给所有连接的客户端 - ✅ 心跳机制(发送 PING 帧) - ✅ 客户端连接管理(链表或数组) - ✅ 支持二进制数据帧 - ✅ 使用线程或异步方式处理消息 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值