首页 > 其他分享 >关于c语言操作libwebsockets示例

关于c语言操作libwebsockets示例

时间:2023-10-12 11:34:36浏览次数:38  
标签:info 语言 示例 wsi lws LWS libwebsockets data struct

第一步,安装libwebsockets库,c语言编写的,默认安装引用库,配置相应的库及路径

第二步:上代码

main.h 

//
// Created by Administrator on 2020/5/1.
//
 
#ifndef MEDIA_MAIN_H
#define MEDIA_MAIN_H
 
#define  bool char
 
volatile int exit_sig = 0;
 
#define MAX_PAYLOAD_SIZE  10 * 1024
 
 
void sighdl( int sig ) {
    lwsl_notice( "%d traped", sig );
    exit_sig = 1;
}
 
/**
 * 会话上下文对象,结构根据需要自定义
 */
struct session_data {
    int msg_count;
    unsigned char buf[LWS_PRE + MAX_PAYLOAD_SIZE];
    int len;
    bool bin;
    bool fin;
};
 
#endif //MEDIA_MAIN_H

main.c

 

#include "libwebsockets.h"
#include <signal.h>
#include <string.h>
 
#include "main.h"
 
 
 
static int protocol_ws_callback( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len ) {
 
    struct session_data *data = (struct session_data *) user;
 
    switch ( reason ) {
        case LWS_CALLBACK_ESTABLISHED:       // 当服务器和客户端完成握手后
            printf("Client connect!\n");
            break;
        case LWS_CALLBACK_RECEIVE:           // 当接收到客户端发来的帧以后
            // 判断是否最后一帧
            data->fin = lws_is_final_fragment( wsi );
            // 判断是否二进制消息
            data->bin = lws_frame_is_binary( wsi );
            // 对服务器的接收端进行流量控制,如果来不及处理,可以控制之
            // 下面的调用禁止在此连接上接收数据
            lws_rx_flow_control( wsi, 0 );
 
            // 业务处理部分,为了实现Echo服务器,把客户端数据保存起来
            memcpy( &data->buf[ LWS_PRE ], in, len );
            data->len = len;
            printf("recvied message:%s\n",in);
            printf("##########################LWS_CALLBACK_RECEIVE####################################wsi=%d wsi=%02x\n",wsi);
            // 需要给客户端应答时,触发一次写回调
            lws_callback_on_writable( wsi );
            break;
        case LWS_CALLBACK_SERVER_WRITEABLE:   // 当此连接可写时
            printf("##############################LWS_CALLBACK_SERVER_WRITEABLE########################wsi=%02x\n",wsi);
            lws_write( wsi, &data->buf[ LWS_PRE ], data->len, LWS_WRITE_TEXT );
            // 下面的调用允许在此连接上接收数据
            lws_rx_flow_control( wsi, 1 );
            break;
    }
    // 回调函数最终要返回0,否则无法创建服务器
    return 0;
}
 
/**
 * 支持的WebSocket子协议数组
 * 子协议即JavaScript客户端WebSocket(url, protocols)第2参数数组的元素
 * 你需要为每种协议提供回调函数
 */
struct lws_protocols protocols[] = {
        {      //协议名称,协议回调,接收缓冲区大小
                "ws", protocol_ws_callback, sizeof( struct session_data ), MAX_PAYLOAD_SIZE,
        },
        {
                NULL, NULL,   0 // 最后一个元素固定为此格式
        }
};
 
 
 
int main(int argc,char **argv)
{
    // 信号处理函数
    signal( SIGTERM, sighdl );
 
    struct lws_context_creation_info ctx_info = { 0 };
    ctx_info.port = 6008;
    ctx_info.iface = NULL; // 在所有网络接口上监听
    ctx_info.protocols = protocols;
    ctx_info.gid = -1;
    ctx_info.uid = -1;
    ctx_info.options = LWS_SERVER_OPTION_VALIDATE_UTF8;
    struct lws_context *context = lws_create_context(&ctx_info);
 
    while ( !exit_sig ) {
        lws_service(context, 1000);
    }
 
    lws_context_destroy(context);
 
    return 0;
}
 
 

第三步。随便找一个websocket客户端进行测试,实测通过!

标签:info,语言,示例,wsi,lws,LWS,libwebsockets,data,struct
From: https://www.cnblogs.com/kn-zheng/p/17759107.html

相关文章

  • 【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户
    问题描述在AppService上放置一个JS页面并引用msal.min.js,目的是获取AAD用户名并展示。问题解答示例代码<!DOCTYPEhtml><html><head><title>AzureService</title></head><scripttype="text/javascript"src="https://alcdn.msauth.net/......
  • 【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户
    问题描述在AppService上放置一个JS页面并引用msal.min.js,目的是获取AAD用户名并展示。问题解答示例代码<!DOCTYPEhtml><html><head><title>AzureService</title></head><scripttype="text/javascript"src="https://alcdn.msauth.net/lib/1.......
  • C语言函数和指针的关系之二(未完)
    指针作为函数的返回值一个函数可以返回整型数据、字符数据、浮点型的数据,也可以返回一个指针.例30:char*fun(){charstr[100]="helloworld";returnstr;}intmain(){char*p;p=fun();printf("%s\n",p);//}//总结:返回地址的时候,地址指向的内存的内容不能释放如果返回......
  • Effective C++ 笔记-1.1视C++为一个语言联邦
    应当这样正确的看待C++语言,将C++视为一个由相关次语言组成的联邦,而非单一语言。每种次语言都有自己的守则,当你从一个次语言移向另一个次语言,守则可能改变。其主要的次语言总共有4个:C:Object-OrientedC++;TemplateC++:STL:******C++高效编程守则视状况而变化,取决于你使用C+......
  • 畅想未来编程语言
    语言前端后端逻辑游戏引擎C++pyQt转pyC++主流的都用(UE,Godot,Source2,Unity...)C#.NETGodotJavaKotlin安卓原生SpringBoot案例:MinecraftHTML(CSS)Vue(Tauri)JSdartflutter跨平台PythonpyTorch,fastAPIRustTauri跨平台Bevy跨......
  • [C语言快速入门] 基础知识和基本数据类型
    [C语言快速入门]基础知识和基本数据类型这里主要的知识点主要来自这两个教学视频:史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】_哔哩哔哩_bilibiliC语言基础入门_C3程序猿_哔哩哔哩_bilibili这本书:《CPrimerPlus(第6版)中文版》在本文开篇之前,想简单写一下关于......
  • 软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析
    引言在SQL中,JOIN是一种重要的操作,用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型,其中之一是RIGHTJOIN。RIGHTJOIN用于从右表中选择所有记录,并将其与左表中匹配的记录组合在一起。本文将深入探讨SQLRIGHTJOIN的语法、用法以及通过实例解析来说明其作用。RIGH......
  • 软件测试|深入理解SQL FULL JOIN:语法、用法及示例解析
    简介在SQL中,JOIN是一个强大的操作,它允许将两个或多个表中的数据进行关联。SQL提供了多种JOIN类型,其中之一是FULLJOIN。FULLJOIN允许从左表和右表中选择所有记录,并将它们组合在一起。本文将深入探讨SQLFULLJOIN的语法、用法,并通过实例解析来说明其作用。FULLJOIN基本语法......
  • 封装利用libwebsockets写出的客户端、服务端程序为客户端服务端类
    1.封装我们后续将使用c++来开发程序,因此有必要将用c写成的wss客户端、服务端程序作进一步封装,使其成为wss客户端类和服务端类,这样更便于调用。封装后的程序结构: ubuntu@ubuntu-virtual-machine:~/work/test_libwebsockets/lws_class$tree .├──client│  ├──cl......
  • 造轮子之多语言管理
    多语言也是我们经常能用到的东西,asp.netcore中默认支持了多语言,可以使用.resx资源文件来管理多语言配置。但是在修改资源文件后,我们的应用服务无法及时更新,属实麻烦一些。我们可以通过扩展IStringLocalizer,实现我们想要的多语言配置方式,比如Json配置,PO文件配置,EF数据库配置等等......