c语言标准库 SOCKET,[转载] 基于C/C++的WebSocket库

libwebsockets

简介

libwebsockets 是一个纯 C 语言的轻量级 WebSocket库,它的 CPU、内存占用很小,同时支持作为服务器端/客户端。其特性包括:支持 ws:// 和 wss:// 协议

可以选择和 OpenSSL、CyaSSL 或者 WolfSSL 链接

轻量和高速,即使在每个线程处理多达250个连接的情况下

支持事件循环、零拷贝。支持 poll()、libev(epoll)、libuv

libwebsockets 提供的 API 相当底层,实现简单的功能也需要相当冗长的代码。

构建git clone git clone https://github.com/warmcat/libwebsockets.git

cd libwebsockets

mkdir build && cd build

cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/home/alex/CPP/lib/libwebsockets ..

make && make install

Echo 示例

CMake 项目配置cmake_minimum_required(VERSION 2.8.9)

project(libws-study C)

include_directories(/home/alex/CPP/lib/libwebsockets/include)

set(CMAKE_CXX_FLAGS "-w -pthread")

set(SF_CLIENT client.c)

set(SF_SERVER server.c)

add_executable(client ${SF_CLIENT})

target_link_libraries(client /home/alex/CPP/lib/libwebsockets/lib/libwebsockets.so)

add_executable(server ${SF_SERVER})

target_link_libraries(server /home/alex/CPP/lib/libwebsockets/lib/libwebsockets.so)

客户端#include "libwebsockets.h"

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

};

/**

* 某个协议下的连接发生事件时,执行的回调函数

*

* wsi:指向WebSocket实例的指针

* reason:导致回调的事件

* user 库为每个WebSocket会话分配的内存空间

* in 某些事件使用此参数,作为传入数据的指针

* len 某些事件使用此参数,说明传入数据的长度

*/

int 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_CLIENT_ESTABLISHED: // 连接到服务器后的回调

lwsl_notice( "Connected to server\n" );

break;

case LWS_CALLBACK_CLIENT_RECEIVE: // 接收到服务器数据后的回调,数据为in,其长度为len

lwsl_notice( "Rx: %s\n", (char *) in );

break;

case LWS_CALLBACK_CLIENT_WRITEABLE: // 当此客户端可以发送数据时的回调

if ( data->msg_count < 3 ) {

// 前面LWS_PRE个字节必须留给LWS

memset( data->buf, 0, sizeof( data->buf ));

char *msg = (char *) &data->buf[ LWS_PRE ];

data->len = sprintf( msg, "你好 %d", ++data->msg_count );

lwsl_notice( "Tx: %s\n", msg );

// 通过WebSocket发送文本消息

lws_write( wsi, &data->buf[ LWS_PRE ], data->len, LWS_WRITE_TEXT );

}

break;

}

return 0;

}

/**

* 支持的WebSocket子协议数组

* 子协议即JavaScript客户端WebSocket(url, protocols)第2参数数组的元素

* 你需要为每种协议提供回调函数

*/

struct lws_protocols protocols[] = {

{

//协议名称,协议回调,接收缓冲区大小

"", callback, sizeof( struct session_data ), MAX_PAYLOAD_SIZE,

},

{

NULL, NULL, 0 // 最后一个元素固定为此格式

}

};

int main() {

// 信号处理函数

signal( SIGTERM, sighdl );

// 用于创建vhost或者context的参数

struct lws_context_creation_info ctx_info = { 0 };

ctx_info.port = CONTEXT_PORT_NO_LISTEN;

ctx_info.iface = NULL;

ctx_info.protocols = protocols;

ctx_info.gid = -1;

ctx_info.uid = -1;

// 创建一个WebSocket处理器

struct lws_context *context = lws_create_context( &ctx_info );

char *address = "192.168.0.89";

int port = 9090;

char addr_port[256] = { 0 };

sprintf( addr_port, "%s:%u", address, port & 65535 );

// 客户端连接参数

struct lw

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值