Websocket++库分帧发送message_ptr参数设置

Websocket++是一个封装了Websocket协议的C++库,当我们想使用websocket协议的分帧传输时,会用到的发送接口:其原型如下

template <typename connection, typename config>
void endpoint<connection,config>::send(connection_hdl hdl, message_ptr msg, lib::error_code & ec)
{
    connection_ptr con = get_con_from_hdl(hdl,ec);
    if (ec) {return;}
    ec = con->send(msg);
}

template <typename connection, typename config>
void endpoint<connection,config>::send(connection_hdl hdl, message_ptr msg) 
{
    lib::error_code ec;
    send(hdl,msg,ec);
    if (ec) { throw exception(ec); }
}

message_ptr msg这个参数比较难搞,这是一个指针,可我们往往不清楚如何给它创建对象。

平时我们给指针创建对象是这样做的:

char* p1 = new char;

int* p2 = new int;

可是,如果

message_ptr msg = new message_ptr;

这是错误的,创建它的对象很麻烦,正确创建方法:

typedef websocketpp::client<websocketpp::config::asio_tls_client> client;	
typedef websocketpp::message_buffer::message<websocketpp::message_buffer::alloc::con_msg_manager>	message_type;
typedef websocketpp::message_buffer::alloc::con_msg_manager<message_type>	con_msg_man_type;
con_msg_man_type::ptr manager = websocketpp::lib::make_shared<con_msg_man_type>();
client::message_ptr msg = manager->get_message(websocketpp::frame::opcode::BINARY, 1024);

实际使用情况:

注意我例子中使用的是TLS/SSL加密方式:

#include <websocketpp/config/asio_client.hpp>

typedef websocketpp::client<websocketpp::config::asio_tls_client> client;

大家一般都是用非加密的:

#include <websocketpp/config/asio_no_tls_client.hpp>

typedef websocketpp::client<websocketpp::config::asio_client> client;


//如下流程是client端发送给server端的一个字符串信息“hello”

typedef websocketpp::client<websocketpp::config::asio_tls_client> client;	
typedef websocketpp::message_buffer::message<websocketpp::message_buffer::alloc::con_msg_manager>	message_type;
typedef websocketpp::message_buffer::alloc::con_msg_manager<message_type>	con_msg_man_type;
con_msg_man_type::ptr manager = websocketpp::lib::make_shared<con_msg_man_type>();

//创建client::message_ptr对象,容量初始大小为1024(可随便设置),用于设置数据帧的基本参数
client::message_ptr msg = manager->get_message(websocketpp::frame::opcode::BINARY, 1024);

//每个数据帧一般只设置这三个参数即可,分帧和不分帧只有fin和opcode会有区别	,
//不分帧:fin=true,opcode!=0;(默认每一帧大小在32MB以内,可以更改:m_pEndpoint->set_max_message_size(32000000))
//分帧:第一帧fin=false,opcode!=0,中间帧fin=false,opcode=0,最后一帧fin=true,opcode=0;(默认所有分帧总和在32MB以内,因为发送端分帧,但是接收端是接收完所有分帧,且合并成一帧,才会触发接收回调函数on_message())
msg->set_fin(true);    //true:最后一帧数据  false:还有下一帧数据
msg->set_opcode(websocketpp::frame::opcode::value::BINARY);    //数据格式是二进制,  CONTINUATION=0x0,TEXT=0x1,BINARY=0x2
msg->set_payload("hello"); // 发送数据的内容

//调用发送接口,发送数据帧
m_pEndpoint->send(m_Server_hdl, msg);

猜你喜欢

转载自blog.csdn.net/wu10188/article/details/124827471