libwebsocket建立服務器需要編寫LWS_CALLBACK_ADD_HEADERS事件處理

最近在使用libwebsocket,感覺它搭建Http與websocket服務器比較簡單,不像poco庫那么龐大,但當我使用它建立websocket服務器后,發現websocket客戶端連接一直沒有連接成功,不知道什么原因,經過一天的調試,終于搞通,因此記錄一下被坑的一天,以下是調通的完整DEMO:

#include <libwebsockets.h>
#include <stdio.h>
#include <string.h>/* 定義支持的協議 */
enum protocols {PROTOCOL_HTTP = 0,PROTOCOL_CHAT,PROTOCOL_JSON,PROTOCOL_COUNT
};/* WebSocket 協議回調函數 */
static int callback_chat(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {printf("callback_chat %d\n", reason);switch (reason) {case LWS_CALLBACK_ESTABLISHED:printf("[Chat] 客戶端連接成功 (協議: %s)\n", lws_get_protocol(wsi)->name);break;case LWS_CALLBACK_RECEIVE:printf("[Chat] 收到消息: %.*s\n", (int)len, (char*)in);// 回聲lws_write(wsi, (unsigned char*) in, len, LWS_WRITE_TEXT);break;default:break;}return 0;
}static int callback_json(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {printf("callback_json %d\n", reason);switch (reason) {case LWS_CALLBACK_ESTABLISHED:printf("[JSON] 客戶端連接成功 (協議: %s)\n", lws_get_protocol(wsi)->name);break;case LWS_CALLBACK_RECEIVE:printf("[JSON] 收到消息: %.*s\n", (int)len, (char*)in);// 返回 JSON 響應const char* response = "{\"status\":\"ok\",\"data\":\"received\"}";lws_write(wsi, (unsigned char*)response, strlen(response), LWS_WRITE_TEXT);break;}return 0;
}/* HTTP 回調函數(處理非 WebSocket 請求) */
static int callback_http(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {printf("callback_http %d\n", reason);switch (reason) {case LWS_CALLBACK_HTTP: {printf("收到 HTTP 請求: %s\n", (char*)in);}case LWS_CALLBACK_ESTABLISHED:printf("收到 websocket連接成功\n");lws_callback_on_writable(wsi);break;case LWS_CALLBACK_SERVER_WRITEABLE:printf("收到 LWS_CALLBACK_SERVER_WRITEABLE len:%u user:%d in:%d\n", len, user, in);if (len > 0){printf("收到 LWS_CALLBACK_SERVER_WRITEABLE data:%s\n", (char*)in);lws_write(wsi, (unsigned char*)in, len, LWS_WRITE_TEXT);}break;case LWS_CALLBACK_ADD_HEADERS: {struct lws_process_html_args* args =(struct lws_process_html_args*)in;printf("收到 LWS_CALLBACK_ADD_HEADERS data:%s\n", (char*)&args->p);if (lws_add_http_header_by_name(wsi,NULL,NULL, 0,(unsigned char**)&args->p,(unsigned char*)args->p + args->max_len))//必須要調用此函數后libwebsocket才會發出數據,也就是說如果要發送HTTP 101狀態數據時,要調用這個才會發出return 1;break;}default:break;}return 0;
}static int callback_text(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {printf("callback_text %d\n", reason);//switch (reason) {//default://    break;//}return 0;
}
static int callback_websocket(struct lws* wsi, enum lws_callback_reasons reason, void* user, void* in, size_t len) {printf("callback_websocket %d\n", reason);//switch (reason) {//default://    break;//}return 0;
}/* 協議列表 */
static struct lws_protocols protocols[] = {/* 第一個協議必須用于 HTTP */{"http",callback_http,0,0},/* WebSocket 協議 */{"chat",callback_chat,0,1024},{"json",callback_json,0,1024},{"text",callback_text,0,1024},{"websocket",callback_websocket,0,1024},{ NULL, NULL, 0, 0 } // 結束標記
};int main() {struct lws_context_creation_info info;memset(&info, 0, sizeof(info));/* 基本配置 */info.port = 9002;                           // 監聽端口info.protocols = protocols;                 // 協議列表info.gid = -1;info.uid = -1;info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; // 啟用 SSL(可選)info.options |= LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT;//info.options |= LWS_SERVER_OPTION_LOG_ALL;/* 創建上下文 */struct lws_context* context = lws_create_context(&info);if (!context) {fprintf(stderr, "libwebsockets 初始化失敗\n");return -1;}printf("服務器啟動,監聽端口 9002...\n");printf("測試命令:\n");printf("  - WebSocket (Chat): wscat -c ws://localhost:9002 -p chat\n");printf("  - WebSocket (JSON): wscat -c ws://localhost:9002 -p json\n");printf("  - HTTP: curl http://localhost:9002\n");/* 事件循環 */while (1) {lws_service(context, 0);}lws_context_destroy(context);return 0;
}

需要值得注意的是,必須要寫LWS_CALLBACK_ADD_HEADERS事件的代碼,libwesocket才會發送“HTTP/1.1 101 Switching Protocols\r\n”協議,讓客戶端連接成功,否則客戶端認為一直不能連接成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77069.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從 PyTorch 到 ONNX:深度學習模型導出全解析

在模型訓練完畢后&#xff0c;我們通常希望將其部署到推理平臺中&#xff0c;比如 TensorRT、ONNX Runtime 或移動端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 與這些平臺之間的橋梁。 本文將以一個圖像去噪模型 SimpleDenoiser 為例&a…

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程&#xff08;續&#xff09; 第二十一章&#xff1a;監控與告警系統集成 21.1 Prometheus監控體系搭建 Exporter部署&#xff1a; # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件圖紙包含太多的空白怎么解決

1、 文檔目標 AD設計文件導出PDF時&#xff0c;圖紙模板方向設置問題 2、 問題場景 AD使用Smart PDF導出PDF時&#xff0c;不管你怎么設置頁面尺寸&#xff0c;只要從橫向轉為縱向輸出&#xff0c;輸出的始終是橫向紙張&#xff08;中間保留縱向圖紙&#xff0c;兩邊大量留白…

大廠面試:六大排序

前言 本篇博客集中了冒泡&#xff0c;選擇&#xff0c;二分插入&#xff0c;快排&#xff0c;歸并&#xff0c;堆排&#xff0c;六大排序算法 如果覺得對你有幫助&#xff0c;可以點點關注&#xff0c;點點贊&#xff0c;謝謝你&#xff01; 1.冒泡排序 //冒泡排序&#xff…

大模型開發:源碼分析 Qwen 2.5-VL 視頻抽幀模塊(附加FFmpeg 性能對比測試)

目錄 qwen 視頻理解能力 messages 構建 demo qwen 抽幀代碼分析 驗證兩個實際 case 官網介紹圖 性能對比&#xff1a;ffmpeg 抽幀、decord 庫抽幀 介紹 聯系 對比 測試結果 測試明細 ffmpeg 100 qps 測試&#xff08;CPU&#xff09; decord 100 qps 測試&#x…

git的上傳流程

好久沒使用git 命令上傳遠程倉庫了。。。。。溫習了一遍&#xff1b; 幾個注意點--單個文件大小不能超過100M~~~ 一步步運行下面的命令&#xff1a; 進入要上傳的文件夾內&#xff0c;點擊git bash 最終 hbu的小伙伴~有需要nndl實驗的可以自形下載哦

驅動學習專欄--字符設備驅動篇--2_字符設備注冊與注銷

對于字符設備驅動而言&#xff0c;當驅動模塊加載成功以后需要注冊字符設備&#xff0c;同樣&#xff0c;卸載驅動模 塊的時候也需要注銷掉字符設備。字符設備的注冊和注銷函數原型如下所示 : static inline int register_chrdev(unsigned int major, const char *name, const…

redis 放置序列化的對象,如果修改對象,需要修改版本號嗎?

在 Redis 中存儲序列化對象時,如果修改了對象的類結構(例如增刪字段、修改字段類型或順序),是否需要修改版本號取決于序列化協議的兼容性策略和業務場景的容錯需求。以下是詳細分析: 1. 為什么需要考慮版本號? 序列化兼容性問題: 當對象的類結構發生變化時,舊版本的序列…

WPF ObjectDataProvider

在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一個非常有用的類,用于將非 UI 數據對象(如業務邏輯類或服務類)與 XAML 綁定集成。它允許在 XAML 中直接調用方法、訪問屬性或實例化對象,而無需編寫額外的代碼。以下是關于 ObjectDataProvider 的詳細…

深度學習-損失函數 python opencv源碼(史上最全)

目錄 定義 種類 如何選擇損失函數&#xff1f; 平方&#xff08;均方&#xff09;損失函數&#xff08;Mean Squared Error, MSE&#xff09; 均方根誤差 交叉熵 對數損失 筆記回饋 邏輯回歸中一些注意事項&#xff1a; 定義 損失函數又叫誤差函數、成本函數、代價函數…

poll為什么使用poll_list鏈表結構而不是數組 - 深入內核源碼分析

一&#xff1a;引言 在Linux內核中,poll機制是一個非常重要的I/O多路復用機制。它允許進程監視多個文件描述符,等待其中任何一個進入就緒狀態。poll的內部實現使用了poll_list鏈表結構而不是數組,這個設計選擇背后有其深層的技術考量。本文將從內核源碼層面深入分析這個設計決…

使用 Azure AKS 保護 Kubernetes 部署的綜合指南

企業不斷尋求增強其軟件開發和部署流程的方法。DevOps 一直是這一轉型的基石,彌合了開發與運營之間的差距。然而,隨著安全威脅日益復雜,將安全性集成到 DevOps 流水線(通常稱為 DevSecOps)已變得勢在必行。本指南深入探討了如何使用 Azure Kubernetes 服務 (AKS) 來利用 D…

2025年常見滲透測試面試題-webshell免殺思路(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 webshell免殺思路 PHP免殺原理 webshell免殺測試&#xff1a; webshell免殺繞過方法&#xff1a; 編…

訪問不到服務器上啟動的llamafactory-cli webui

采用SSH端口轉發有效&#xff0c;在Windows上面進行訪問 在服務器上啟動 llamafactory-cli webui 后&#xff0c;訪問方式需根據服務器類型和網絡環境選擇以下方案&#xff1a; 一、本地服務器&#xff08;物理機/虛擬機&#xff09; 1. 直接訪問 若服務器與操作設備處于同一…

基于 LSTM 的多特征序列預測-SHAP可視化!

往期精彩內容&#xff1a; 單步預測-風速預測模型代碼全家桶-CSDN博客 半天入門&#xff01;鋰電池剩余壽命預測&#xff08;Python&#xff09;-CSDN博客 超強預測模型&#xff1a;二次分解-組合預測-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention預測模型…

C++ 編程指南35 - 為保持ABI穩定,應避免模板接口

一&#xff1a;概述 模板在 C 中是編譯期展開的&#xff0c;不同模板參數會生成不同的代碼&#xff0c;這使得模板類/函數天然不具備 ABI 穩定性。為了保持ABI穩定&#xff0c;接口不要直接用模板&#xff0c;先用普通類打個底&#xff0c;模板只是“外殼”&#xff0c;這樣 AB…

【iOS】OC高級編程 iOS多線程與內存管理閱讀筆記——自動引用計數(二)

自動引用計數 前言ARC規則所有權修飾符**__strong修飾符**__weak修飾符__unsafe_unretained修飾符__autoreleasing修飾符 規則屬性數組 前言 上一篇我們主要學習了一些引用計數方法的內部實現&#xff0c;現在我們學習ARC規則。 ARC規則 所有權修飾符 OC中&#xff0c;為了處…

可信空間數據要素解決方案

可信空間數據要素解決方案 一、引言 隨著數字經濟的蓬勃發展&#xff0c;數據已成為重要的生產要素。可信空間數據要素解決方案旨在構建一個安全、可靠、高效的數據流通與應用環境&#xff0c;促進數據要素的合理配置和價值釋放&#xff0c;推動各行業的數字化轉型和創新發展…

mysql刪除表后重建表報錯Tablespace exists

版本 mysql:8.0.23 復現步驟 1、刪除表 DROP TABLE IF EXISTS xxx_demo; 2、新建表 CREATE TABLE xxx_demo (id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵id,creator varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT COMMENT 創建者,c…

【Leetcode-Hot100】缺失的第一個正數

題目 解答 有一處需要注意&#xff0c;我使用注釋部分進行交換值&#xff0c;報錯&#xff1a;超出時間限制。有人知道是為什么嗎&#xff1f;難道是先給nums[i]賦值后&#xff0c;從而改變了后一項的索引&#xff1f; class Solution(object):def firstMissingPositive(sel…