如何设置Websocketpp缓冲区大小 限制缓存消息数并清空缓冲区
Websocketpp 缓冲区消息条数限制与清空操作实现
Websocketpp 原生默认按字节数控制缓冲区上限,没有提供直接按消息条数限制的配置项,你可以通过公开接口配合简单的封装实现需求,服务端和客户端的实现逻辑完全通用。
限制缓冲区最多缓存10条消息,超出自动丢弃
注意:Websocketpp 内部不会堆积已完成解析的接收消息,收到完整消息后会立刻触发
on_message回调,绝大多数场景下需要限制的是发送侧缓冲区:也就是你调用send方法后,还没写入TCP内核缓冲区、暂存在Websocketpp用户态内存里的待发消息。如果你在on_message回调里做异步消费、自己维护了接收侧缓存队列,条数限制逻辑和发送侧一致。
实现步骤:
- 先调整默认的字节数限制,避免字节阈值提前拦截消息,把单条消息的最大字节上限设为你业务场景中单条消息不会超过的合理值即可:
// 以服务端为例,客户端把server换成对应的client类型即可 using ws_server = websocketpp::server<websocketpp::config::asio>; ws_server s; // 设置单条发送/接收消息的最大字节数,根据业务实际调整 s.set_max_send_message_size(10 * 1024 * 1024); s.set_max_recv_message_size(10 * 1024 * 1024);
- 封装统一的发送方法,所有业务发送逻辑都走这个方法,不要直接调用原生
send:每次发送前先查询当前连接的待发队列长度,已经达到10条就直接丢弃新消息,不推入发送队列。
bool send_with_limit(ws_server::connection_ptr con, const std::string& payload, websocketpp::frame::opcode::value op) { // 获取当前连接发送队列中待发的消息条数 size_t pending_count = con->get_send_queue_count(); // 队列已满,直接丢弃新消息 if (pending_count >= 10) { return false; } // 队列未满,正常发送 websocketpp::lib::error_code ec; con->send(payload, op, ec); return !ec; }
如果你的业务需要队列满时丢弃最早的旧消息、保留新消息,只需要在判断队列满的时候先调用一次清空队列的接口(见下文),再推入新消息即可。
清空缓冲区所有缓存消息
Websocketpp 提供了公开接口直接清空指定连接的发送缓冲区,不需要手动修改内部成员:
bool clear_connection_buffer(ws_server::connection_ptr con) { websocketpp::lib::error_code ec; // 清空该连接所有待发送的缓存消息 con->clear_send_queue(ec); return !ec; }
如果你自己维护了接收侧的异步消费队列,直接清空你自己存储消息的容器即可——Websocketpp 不会留存已经通过on_message回调交付给业务层的接收消息。
补充说明
- 以上用到的
get_send_queue_count和clear_send_queue接口在Websocketpp 0.3.0及以上稳定版本都可使用,服务端、客户端的连接对象都支持,不需要修改库源码。 - 不要直接访问连接类的私有队列成员,避免跨版本兼容性问题。
内容的提问来源于stack exchange,提问作者eng_hish
相关产品推荐
相关产品推荐

