From 453994f26bc58f59ef5c82fc739ec97f2b263f50 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Tue, 13 Aug 2019 12:00:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=8F=E5=B0=91=E5=86=85=E5=AD=98=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D,=E6=8F=90=E9=AB=98websocket=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/HttpSession.cpp | 8 ++++---- src/Http/HttpSession.h | 5 ++--- src/Http/WebSocketSession.h | 16 +++++++--------- src/Http/WebSocketSplitter.cpp | 10 +++++----- src/Http/WebSocketSplitter.h | 12 ++++++------ 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/Http/HttpSession.cpp b/src/Http/HttpSession.cpp index 5e51e589..f1c468d2 100644 --- a/src/Http/HttpSession.cpp +++ b/src/Http/HttpSession.cpp @@ -954,12 +954,12 @@ void HttpSession::onWrite(const Buffer::Ptr &buffer) { header._reserved = 0; header._opcode = WebSocketHeader::BINARY; header._mask_flag = false; - WebSocketSplitter::encode(header,(uint8_t *)buffer->data(),buffer->size()); + WebSocketSplitter::encode(header,buffer); } -void HttpSession::onWebSocketEncodeData(const uint8_t *ptr,uint64_t len){ - _ui64TotalBytes += len; - send((char *)ptr,len); +void HttpSession::onWebSocketEncodeData(const Buffer::Ptr &buffer){ + _ui64TotalBytes += buffer->size(); + send(buffer); } void HttpSession::onDetach() { diff --git a/src/Http/HttpSession.h b/src/Http/HttpSession.h index e1df8b1c..48545e8e 100644 --- a/src/Http/HttpSession.h +++ b/src/Http/HttpSession.h @@ -104,10 +104,9 @@ protected: /** * 发送数据进行websocket协议打包后回调 - * @param ptr - * @param len + * @param buffer */ - void onWebSocketEncodeData(const uint8_t *ptr,uint64_t len) override; + void onWebSocketEncodeData(const Buffer::Ptr &buffer) override; private: inline void Handle_Req_GET(int64_t &content_len); inline void Handle_Req_POST(int64_t &content_len); diff --git a/src/Http/WebSocketSession.h b/src/Http/WebSocketSession.h index ab461f5f..6862e9bc 100644 --- a/src/Http/WebSocketSession.h +++ b/src/Http/WebSocketSession.h @@ -89,7 +89,7 @@ protected: header._reserved = 0; header._opcode = WebSocketHeader::TEXT; header._mask_flag = false; - strongSelf->WebSocketSplitter::encode(header,(uint8_t *)buf->data(),buf->size()); + strongSelf->WebSocketSplitter::encode(header,buf); } return buf->size(); }); @@ -118,12 +118,12 @@ protected: switch (header._opcode){ case WebSocketHeader::CLOSE:{ - HttpSessionType::encode(header,nullptr,0); + HttpSessionType::encode(header,nullptr); } break; case WebSocketHeader::PING:{ const_cast(header)._opcode = WebSocketHeader::PONG; - HttpSessionType::encode(header,(uint8_t *)_remian_data.data(),_remian_data.size()); + HttpSessionType::encode(header,std::make_shared(_remian_data)); } break; case WebSocketHeader::CONTINUATION:{ @@ -132,8 +132,7 @@ protected: break; case WebSocketHeader::TEXT: case WebSocketHeader::BINARY:{ - BufferString::Ptr buffer = std::make_shared(_remian_data); - _session->onRecv(buffer); + _session->onRecv(std::make_shared(_remian_data)); } break; default: @@ -145,11 +144,10 @@ protected: /** * 发送数据进行websocket协议打包后回调 - * @param ptr - * @param len + * @param buffer */ - void onWebSocketEncodeData(const uint8_t *ptr,uint64_t len) override{ - SocketHelper::send((char *)ptr,len); + void onWebSocketEncodeData(const Buffer::Ptr &buffer) override{ + SocketHelper::send(buffer); } private: typedef function onBeforeSendCB; diff --git a/src/Http/WebSocketSplitter.cpp b/src/Http/WebSocketSplitter.cpp index 280e3a1c..0f164ecb 100644 --- a/src/Http/WebSocketSplitter.cpp +++ b/src/Http/WebSocketSplitter.cpp @@ -164,9 +164,9 @@ void WebSocketSplitter::onPlayloadData(uint8_t *ptr, uint64_t len) { onWebSocketDecodePlayload(*this, _mask_flag ? ptr - len : ptr, len, _playload_offset); } -void WebSocketSplitter::encode(const WebSocketHeader &header,uint8_t *data, const uint64_t len) { +void WebSocketSplitter::encode(const WebSocketHeader &header,const Buffer::Ptr &buffer) { string ret; - + auto len = buffer ? buffer->size() : 0; uint8_t byte = header._fin << 7 | ((header._reserved & 0x07) << 4) | (header._opcode & 0x0F) ; ret.push_back(byte); @@ -195,16 +195,16 @@ void WebSocketSplitter::encode(const WebSocketHeader &header,uint8_t *data, cons ret.append((char *)header._mask.data(),4); } - onWebSocketEncodeData((uint8_t*)ret.data(),ret.size()); + onWebSocketEncodeData(std::make_shared(std::move(ret))); if(len > 0){ if(mask_flag){ - uint8_t *ptr = data; + uint8_t *ptr = (uint8_t*)buffer->data(); for(int i = 0; i < len ; ++i,++ptr){ *(ptr) ^= header._mask[i % 4]; } } - onWebSocketEncodeData(data,len); + onWebSocketEncodeData(buffer); } } diff --git a/src/Http/WebSocketSplitter.h b/src/Http/WebSocketSplitter.h index 53447f62..159c5465 100644 --- a/src/Http/WebSocketSplitter.h +++ b/src/Http/WebSocketSplitter.h @@ -31,8 +31,10 @@ #include #include #include -using namespace std; +#include "Network/Buffer.h" +using namespace std; +using namespace toolkit; namespace mediakit { @@ -85,12 +87,10 @@ public: /** * 编码一个数据包 * 将触发2次onWebSocketEncodeData回调 - * 第一次是数据头,第二次是负载数据 * @param header 数据头 - * @param data 负载数据 - * @param len 负载数据长度 + * @param buffer 负载数据 */ - void encode(const WebSocketHeader &header,uint8_t *data,const uint64_t len); + void encode(const WebSocketHeader &header,const Buffer::Ptr &buffer); protected: /** * 收到一个webSocket数据包包头,后续将继续触发onWebSocketDecodePlayload回调 @@ -119,7 +119,7 @@ protected: * @param ptr 数据指针 * @param len 数据指针长度 */ - virtual void onWebSocketEncodeData(const uint8_t *ptr,uint64_t len){}; + virtual void onWebSocketEncodeData(const Buffer::Ptr &buffer){}; private: void onPlayloadData(uint8_t *data,uint64_t len); private: