当前位置:   article > 正文

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/241823
推荐阅读
相关标签
  

闽ICP备14008679号