最全【C++】libwebsockets库的简易教程(附源码(2),C C++开发基础作用

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

lws_callback_on_writable 是 libwebsockets 库中的一个函数,它的含义是将一个 websocket 连接的 writable 回调函数加入到事件循环中。当该连接的网络缓冲区变为空闲状态时,就会触发这个回调函数。这个函数通常用于在 websocket 连接中发送数据。调用该函数可以确保在网络缓冲区可写时立即发送数据,从而提高网络传输效率。

(6)常用的结构体

struct lws                                         // websocket连接句柄
    struct lws_context                           // websocket处理器
    struct lws_context_creation_info    // context参数
    struct lws_protocols                        // 协议层传输句柄
    void* m_pUser;                               // 返回回调的对象
    struct lws_client_connect_info        // 连接参数

2、服务器

以下是使用libwebsockets编写WebSocket服务器的简单步骤:

(1)安装libwebsockets库:您可以从官方网站(https://libwebsockets.org/)下载最新版本的库。

可以通过以下命令安装libwebsockets库:

sudo apt-get install libwebsockets-dev

(2)创建WebSocket服务器

基本的步骤:

a. 创建一个libwebsocket_context对象,该对象将管理所有客户端连接。

b. 设置服务器的协议和端口号。

c. 创建一个回调函数,该函数将处理来自客户端的消息。

d. 启动服务器并等待客户端连接。

处理客户端连接:当客户端连接到服务器时,您需要编写代码来处理连接。这包括验证客户端身份,处理消息和关闭连接。

发送消息:您可以使用libwebsocket库中的函数向客户端发送消息。

下面是一个简单的WebSocket服务器的代码:

libwebsocket开源库中,lws_service回调函数的参数含义如下:

  1. wsi:websocket实例,表示当前正在处理的websocket连接。

  2. reason:关闭连接的原因代码。如果连接未关闭,此参数为0。

  3. user:用户数据,可以使用lws_callback_on_writable函数设置。

  4. in:接收到的数据缓冲区。

  5. len:接收到的数据长度。

  6. flags:标志位,用于指示连接状态等信息。

  7. out:发送数据缓冲区。

  8. out_len:发送数据长度。

  9. reserved:保留参数,暂时没有使用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>

static int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
{
    return 0;
}

static int callback_websocket(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
{
    switch (reason) {
        case LWS_CALLBACK_ESTABLISHED:
            printf("WebSocket connection established\n");
            break;
        case LWS_CALLBACK_RECEIVE:
            printf("Received data: %s\n", (char *)in);
            break;
        case LWS_CALLBACK_CLOSED:
            printf("WebSocket connection closed\n");
            break;
        default:
            break;
    }
    return 0;
}


//注册协议,一种协议,对应一套处理方案(类似驱动中的设备树)
static struct lws_protocols protocols[] = {
    {
        "http",
        callback_http,
        0,
        0,
    },
    {
        "websocket",
        callback_websocket,
        0,
        0,
    },
    { NULL, NULL, 0, 0 } /* end of list */
};

int main(int argc, char **argv)
{
    struct lws_context_creation_info info;
    struct lws_context *context;
    int port = 9000;

    memset(&info, 0, sizeof(info));
    info.port = port;
    info.protocols = protocols;

    context = lws_create_context(&info);

    if (!context) {
        printf("Error creating WebSocket context\n");
        return 1;
    }

    printf("WebSocket server started on port %d\n", port);

    while (1) {
        lws_service(context, 50);
    }

    lws_context_destroy(context);

    return 0;
}

(3)编译和运行服务器

可以使用以下命令编译服务器:

gcc -o server server.c -lwebsockets

然后运行服务器:

./server

现在WebSocket服务器已经启动了,可以使用浏览器或其他WebSocket客户端连接到它。

以上是使用libwebsockets库创建WebSocket服务器的简单教程,希望对你有所帮助。

3、客户端

(1)基本步骤:

A. 在代码中引入libwebsocket库的头文件:

#include <libwebsockets.h>

B. 创建一个lws_context对象,用于管理WebSocket连接:

struct lws_context* context;

C. 定义连接参数结构体,并设置连接信息:

struct lws_client_connect_via_info connect_info = {
    .context = context,
    .address = "192.168.12.226",
    .port = 8081,
    .path = "/",
    .host = "192.168.12.226",
    .origin = "http://192.168.12.226",
    .protocol = NULL,
    .user = NULL,
    .password = NULL
};

D. 使用lws_client_connect_via_info()函数连接到WebSocket服务器:

lws* ws_client = lws_client_connect_via_info(&connect_info);

E. 在连接成功后,可以使用lws_write()函数向服务器发送消息:

char *message = "Hello, WebSocket Server!";
lws_write(ws_client, (unsigned char *)message, strlen(message), LWS_WRITE_TEXT);

F. 最后,在程序结束时,使用lws_context_destroy()函数释放资源:

lws_context_destroy(context);

(2)以下是使用libwebsockets库创建一个基本的WebSocket客户端的示例代码:

lws_client_connect_via_info 是一个函数,用于通过给定的连接信息连接到 WebSocket 服务器。它接受一个指向连接信息结构体的指针作为参数,并返回一个指向连接句柄的指针。连接信息结构体包含有关连接的所有必要信息,例如服务器的地址、端口号、协议等。使用该函数可以方便地连接到 WebSocket 服务器并开始进行通信。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

[外链图片转存中…(img-A9VKnpam-1715820600014)]
[外链图片转存中…(img-V2RqzISm-1715820600014)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值