NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
websocket.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
2#define NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
3
10
20NEFORCE_BEGIN_NAMESPACE__
21NEFORCE_BEGIN_HTTP__
22
27
45
70
79 TEXT = 0x1,
80 BINARY = 0x2,
81 CLOSE = 0x8,
82 PING = 0x9,
83 PONG = 0xA
84};
85
86#pragma pack(push, 1)
104#pragma pack(pop)
105
107
108
133class NEFORCE_API websocket_server {
134public:
137
138private:
140 vector<session_ptr> sessions_;
141 mutable mutex sessions_mutex_;
142
143public:
144 websocket_server() = default;
145 ~websocket_server() = default;
146
147 websocket_server(const websocket_server&) = delete;
148 websocket_server& operator=(const websocket_server&) = delete;
149
150 websocket_server(websocket_server&&) noexcept = delete;
151 websocket_server& operator=(websocket_server&&) noexcept = delete;
152
158 void route(const string& path, session_handler handler) { route_handlers_[path] = _NEFORCE move(handler); }
159
167
172 void remove_session(const session_ptr& session);
173
180
185 size_t session_count() const noexcept {
186 lock<mutex> lk(sessions_mutex_);
187 return sessions_.size();
188 }
189};
190
213class NEFORCE_API websocket_session : public enable_shared_from_this<websocket_session> {
214public:
215 using message_handler = function<void(const string&, websocket_opcode)>;
216 using close_handler = function<void(websocket_status, const string&)>;
217 using error_handler = function<void(const exception&)>;
218
219private:
220 unique_ptr<tcp_socket> socket_;
221 websocket_server* server_;
222
223 atomic<bool> running_{false};
224 atomic_flag closed_once_;
225
226 thread read_thread_;
227 thread write_thread_;
228 thread heartbeat_thread_;
229
230 mutex write_mutex_;
231 condition_variable write_cv_;
232 queue<byte_vector> write_queue_;
233 queue<byte_vector> ctrl_queue_;
234
235 string fragment_buffer_;
236 websocket_opcode fragment_opcode_ = websocket_opcode::TEXT;
237 bool in_fragment_ = false;
238
239 atomic<bool> ping_pending_{false};
240 atomic<int64_t> last_pong_ms_{0};
241
242 message_handler on_message_;
243 close_handler on_close_;
244 error_handler on_error_;
245
246 bool queue_frame(byte_vector frame, bool is_control = false);
247 void write_loop();
248
249 void read_loop();
250 bool read_frame();
251
252 bool dispatch(const websocket_frame_header& hdr, websocket_opcode opcode, string payload);
253 void deliver_message(const string& data, websocket_opcode opcode);
254
255 void send_close_frame(websocket_status status, const string& reason);
256 void handle_close_frame(string payload);
257
258 void heartbeat_loop();
259
260 void do_stop(websocket_status status, const string& reason);
261
262public:
269
274
275 websocket_session(const websocket_session&) = delete;
276 websocket_session& operator=(const websocket_session&) = delete;
277
283 void start();
284
290 void close(websocket_status status = websocket_status::NORMAL_CLOSURE, const string& reason = "");
291
295 void stop();
296
303 bool send(const string& data, websocket_opcode opcode = websocket_opcode::TEXT);
304
310 bool send_binary(const string& data) { return send(data, websocket_opcode::BINARY); }
311
316 bool is_open() const noexcept { return running_ && socket_->is_open(); }
317
322 void set_message_handler(message_handler handler) { on_message_ = _NEFORCE move(handler); }
323
328 void set_close_handler(close_handler handler) { on_close_ = _NEFORCE move(handler); }
329
334 void set_error_handler(error_handler handler) { on_error_ = _NEFORCE move(handler); }
335
340 tcp_socket& socket() noexcept { return *socket_; }
341
346 const tcp_socket& socket() const noexcept { return *socket_; }
347
352 ssl_socket* ssl_socket_ptr() noexcept { return dynamic_cast<ssl_socket*>(socket_.get()); }
353
358 const ssl_socket* ssl_socket_ptr() const noexcept { return dynamic_cast<const ssl_socket*>(socket_.get()); }
359};
360 // WebSocket
362 // HTTP
364
365NEFORCE_END_HTTP__
366NEFORCE_END_NAMESPACE__
367#endif // NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
原子类型完整实现
函数包装器主模板声明
锁管理器模板
非递归互斥锁
文件路径类
队列容器适配器
共享智能指针类模板
SSL/TLS安全Socket类
TCP Socket类
线程类
独占智能指针
无序映射容器
动态大小数组容器
WebSocket服务器类
void route(const string &path, session_handler handler)
注册WebSocket路由
size_t session_count() const noexcept
获取活动会话数量
bool handle_upgrade(const http_request &request, unique_ptr< tcp_socket > sock)
处理WebSocket升级请求
void remove_session(const session_ptr &session)
移除会话
function< void(session_ptr)> session_handler
会话处理器类型
void broadcast(const string &data, websocket_opcode opcode=websocket_opcode::TEXT)
向所有会话广播消息
shared_ptr< websocket_session > session_ptr
会话智能指针类型
WebSocket会话类
ssl_socket * ssl_socket_ptr() noexcept
获取SSL socket指针
void start()
启动会话
function< void(websocket_status, const string &)> close_handler
关闭处理器类型
void set_error_handler(error_handler handler)
设置错误处理器
void close(websocket_status status=websocket_status::NORMAL_CLOSURE, const string &reason="")
关闭连接
function< void(const string &, websocket_opcode)> message_handler
消息处理器类型
bool is_open() const noexcept
检查连接是否开启
bool send(const string &data, websocket_opcode opcode=websocket_opcode::TEXT)
发送文本/二进制消息
bool send_binary(const string &data)
发送二进制消息
websocket_session(unique_ptr< tcp_socket > sock, websocket_server *server=nullptr)
构造函数
const tcp_socket & socket() const noexcept
获取底层socket常量引用
function< void(const exception &)> error_handler
错误处理器类型
~websocket_session()
析构函数
void set_message_handler(message_handler handler)
设置消息处理器
tcp_socket & socket() noexcept
获取底层socket引用
void stop()
停止会话
const ssl_socket * ssl_socket_ptr() const noexcept
获取SSL socket常量指针
void set_close_handler(close_handler handler)
设置关闭处理器
条件变量行为
通用函数包装器
vector< byte_t > byte_vector
字节向量类型别名
unsigned char uint8_t
8位无符号整数类型
unsigned char byte_t
字节类型,定义为无符号字符
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关闭状态码
@ BINARY
二进制帧
@ POLICY_VIOLATION
策略违规
@ PROTOCOL_ERROR
协议错误
@ NO_STATUS_RCVD
未收到状态码
@ BAD_GATEWAY
错误的网关
@ TRY_AGAIN_LATER
稍后重试
@ INVALID_FRAME_PAYLOAD_DATA
无效帧负载
@ NORMAL_CLOSURE
正常关闭
@ SERVICE_RESTART
服务重启
@ UNSUPPORTED_DATA
不支持的数据类型
@ ABNORMAL_CLOSURE
异常关闭
@ GOING_AWAY
端点离开
@ MESSAGE_TOO_BIG
消息过大
@ TLS_HANDSHAKE
TLS握手失败
@ INTERNAL_ERROR
内部错误
@ MANDATORY_EXT
缺少必要扩展
HTTP服务器消息结构
队列容器适配器
共享智能指针实现
SSL/TLS安全Socket实现
通用原子类型模板
异常基类
WebSocket帧头部结构
byte_t fin
是否最后一帧 (bit 7)
byte_t rsv2
保留位2 (bit 5)
byte_t rsv1
保留位1 (bit 6)
byte_t rsv3
保留位3 (bit 4)
byte_t opcode
操作码 (bits 0-3)
byte_t payload_len
负载长度 (bits 0-6)
byte_t masked
是否掩码 (bit 7)
线程管理类
无序映射容器