关于c语言操作libwebsockets示例

第一步,安装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客户端进行测试,实测通过!

posted @ 2023-10-12 11:25  阿风小子  阅读(638)  评论(0编辑  收藏  举报