关于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客户端进行测试,实测通过!

### 回答1: libwebsockets client demo是一个基于C语言编写的网页套接字客户端示例程序。它使用了libwebsockets库,这是一个轻量级的C库,实现了WebSocket协议和HTTP协议。 libwebsockets client demo可以被用于开发Websocket客户端程序。一个传统的客户端只能通过HTTP协议和服务器进行交互,但是Websocket有自己的协议,比HTTP更加灵活。Websocket可以支持服务器向客户端发送实时数据,这对于一些需要实时交互和数据推送的应用来说非常重要。 在libwebsockets client demo示例程序中,我们可以看到它可以连接到特定的WebSocket服务器,并在与服务器通信的过程中交换消息。这些消息可能是纯文本格式,也可能是二进制格式。通过这个示例程序,开发人员可以了解如何使用WebSocket协议来开发Websocket客户端程序。 使用libwebsockets client demo示例程序需要一定的编程经验,因为需要了解C语言编程知识。但是一旦理解了它的基本原理,就可以很容易地将其扩展到任何Websocket客户端应用程序中。所以,如果你正在寻找一种实现Websocket客户端程序的方法,libwebsockets client demo示例程序可能会是一个很好的起点。 ### 回答2: libwebsockets是一个开源C库,可以帮助开发者快速实现websocket协议的客户端和服务器端。该库提供了许多示例程序,以帮助用户了解和使用库的功能。其中,client-demo是一个用于演示如何实现websocket客户端的示例程序。 client-demo的主要功能是连接到指定的websocket服务器,并发送一些简单的消息。示例程序在控制台上输出了与服务器的交互信息,包括连接状态、发送和接收数据的流量信息。与其他websocket客户端库相比,libwebsockets具有高效的性能和灵活的可配置选项。使用该库,可以实现各种websocket应用程序,如在线游戏、视频会议等。 该示例程序是使用C语言编写的,针对不同平台和操作系统提供了不同的实现方式。使用步骤包括下载、编译和运行程序。用户可以在程序代码中设置自定义的选项,例如websocket协议版本、消息类型和消息内容。使用client-demo示例程序,开发者可以快速了解libwebsockets库的主要特性和使用方法,并将该库应用于自己的项目中。 总之,client-demo是一个非常有用的示例程序,可以帮助开发者学习和使用libwebsockets库的功能。它提供了一个基本的websocket客户端实现,可以被扩展和改进以满足特定需求。使用该库,开发者可以轻松实现高性能、可靠的websocket客户端程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值