1#ifndef NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
2#define NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
22NEFORCE_BEGIN_NAMESPACE__
135class NEFORCE_API websocket_server {
143 mutable mutex sessions_mutex_;
200 return sessions_.size();
247 bool event_driven_ =
false;
248 size_t heartbeat_timer_id_ = 0;
250 bool write_registered_ =
false;
257 string fragment_buffer_;
258 websocket_opcode fragment_opcode_ = websocket_opcode::TEXT;
259 bool in_fragment_ =
false;
262 atomic<int64_t> last_pong_ms_{0};
264 websocket_deflate_config deflate_config_;
265 unique_ptr<websocket_deflate> deflate_compressor_;
266 unique_ptr<websocket_deflate> deflate_decompressor_;
269 message_handler on_message_;
270 close_handler on_close_;
271 error_handler on_error_;
273 bool queue_frame(byte_vector frame,
bool is_control =
false);
279 bool dispatch(
const websocket_frame_header& hdr, websocket_opcode opcode,
string payload);
280 void deliver_message(
const string& data, websocket_opcode opcode);
282 void send_close_frame(websocket_status status,
const string& reason);
283 void handle_close_frame(
string payload);
285 void heartbeat_loop();
286 void do_stop(websocket_status status,
const string& reason,
bool notify_server =
true);
288 void start_event_driven();
290 void on_readable(
int fd, uint32_t events, error_code ec);
291 void on_writable(
int fd, uint32_t events, error_code ec);
292 void on_heartbeat_timer();
294 void flush_event_writes();
295 void try_parse_frames();
351 bool is_open() const noexcept {
return running_ && socket_->is_open(); }
401 event_driven_ =
true;
434NEFORCE_END_NAMESPACE__
function< void(session_ptr)> session_handler
会话处理器类型
void set_io_context(io_context &ctx) noexcept
设置异步 I/O 执行上下文
bool handle_upgrade(const http_request &request, unique_ptr< tcp_socket > sock)
处理WebSocket升级请求
size_t session_count() const noexcept
获取活动会话数量
shared_ptr< websocket_session > session_ptr
会话智能指针类型
void broadcast(const string &data, websocket_opcode opcode=websocket_opcode::TEXT)
向所有会话广播消息
void remove_session(const session_ptr &session)
移除会话
void route(const string &path, session_handler handler)
注册WebSocket路由
bool send_binary(const string &data)
发送二进制消息
const ssl_socket * ssl_socket_ptr() const noexcept
获取SSL socket常量指针
function< void(const string &, websocket_opcode)> message_handler
消息处理器类型
tcp_socket & socket() noexcept
获取底层socket引用
void set_deflate_config(const websocket_deflate_config &cfg)
设置permessage-deflate配置
void set_error_handler(error_handler handler)
设置错误处理器
function< void(websocket_status, const string &)> close_handler
关闭处理器类型
ssl_socket * ssl_socket_ptr() noexcept
获取SSL socket指针
const tcp_socket & socket() const noexcept
获取底层socket常量引用
bool is_open() const noexcept
检查连接是否开启
bool send(const string &data, websocket_opcode opcode=websocket_opcode::TEXT)
发送文本/二进制消息
bool has_deflate_config() const noexcept
检查是否已启用deflate压缩
function< void(const exception &)> error_handler
错误处理器类型
websocket_session(unique_ptr< tcp_socket > sock, websocket_server *server=nullptr)
构造函数
const websocket_deflate_config & deflate_config() const noexcept
获取permessage-deflate协商配置
void set_io_context(io_context &ctx) noexcept
设置 io_context(启用事件驱动模式)
void set_message_handler(message_handler handler)
设置消息处理器
void close(websocket_status status=websocket_status::NORMAL_CLOSURE, const string &reason="")
关闭连接
void set_close_handler(close_handler handler)
设置关闭处理器
vector< byte_t > byte_vector
字节向量类型别名
unsigned char byte_t
字节类型,定义为无符号字符
unsigned char uint8_t
8位无符号整数类型
unsigned short uint16_t
16位无符号整数类型
http_server_request http_request
HTTP请求类型别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
websocket_opcode
WebSocket帧操作码
websocket_status
WebSocket关闭状态码
@ INVALID_FRAME_PAYLOAD_DATA
无效帧负载
@ UNSUPPORTED_DATA
不支持的数据类型
enable_shared_from_this() noexcept=default
WebSocket permessage-deflate 扩展