wss协议 c 服务器,利用LIBWEBSOCKETS写WS、WSS服务端和客户端

本文介绍了如何使用libwebsockets库创建WS和WSS服务端与客户端。通过示例代码展示了libwebsockets的使用,包括服务端的LWS_CALLBACK_ESTABLISHED、LWS_CALLBACK_RECEIVE和LWS_CALLBACK_SERVER_WRITEABLE回调,以及客户端的连接、接收和发送数据。
摘要由CSDN通过智能技术生成

libwebsockets是一款轻量级用来开发服务器和客户端的C库。按照官方(https://libwebsockets.org/)给出的介绍来看,它不仅支持ws,wss还同时支持http与https,可以轻轻松松结合openssl等库来实现ssl加密。

实现websocket服务本身也是libwebsockets库的初衷,本篇文章将讲解如何利用libwebsockets写ws、wss服务端和客户端。

服务端:

server.c#include "libwebsockets.h"

#include 

#include 

static 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;

};

static int protocol_my_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);

// 需要给客户端应答时,触发一次写回调

lws_callback_on_writab

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值