赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。