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