diff --git a/a8/websocketclient.cc b/a8/websocketclient.cc index ee5d689..febe053 100644 --- a/a8/websocketclient.cc +++ b/a8/websocketclient.cc @@ -63,11 +63,35 @@ namespace a8 tcp_client_->on_socketread = [this] (a8::AsioTcpClient* socket, char* buf, unsigned int buflen) { - if (!handshook_) { - buf[buflen] = '\0'; - } else { + unsigned int already_read_bytes = 0; + do { + if (already_read_bytes < buflen) { + int read_bytes = std::min(buflen - already_read_bytes, + (unsigned int)max_packet_len_ - recv_bufflen_); + if (read_bytes > 0) { + memmove(&recv_buff_[recv_bufflen_], buf + already_read_bytes, read_bytes); + recv_bufflen_ += read_bytes; + already_read_bytes += read_bytes; + } + } - } + int offset = 0; + int prev_offset = 0; + do { + prev_offset = offset; + DecodePacket(recv_buff_, offset, recv_bufflen_); + } while (prev_offset < offset && offset < recv_bufflen_); + + if (offset > 0 && offset < recv_bufflen_){ + memmove(recv_buff_, recv_buff_ + offset, recv_bufflen_ - offset); + } + recv_bufflen_ -= offset; + if (recv_bufflen_ >= max_packet_len_) { + //收到超长包 + Close(); + return; + } + } while (already_read_bytes < buflen); }; } @@ -129,7 +153,7 @@ namespace a8 if (strstr(buf + offset, WEB_SOCKET_KEY) || strstr(buf + offset, WEB_SOCKET_KEY2)) { ProcessWsHandShake(buf, offset, buflen); } else { - //ProcessHttpHandShake(buf, offset, buflen); + abort(); } } @@ -183,20 +207,18 @@ namespace a8 int prev_offset = 0; do { prev_offset = offset; - //DecodeUserPacket(decoded_buff_, offset, decoded_bufflen_); + DecodeUserPacket(decoded_buff_, offset, decoded_bufflen_); } while (prev_offset < offset && offset < decoded_bufflen_); if (offset > 0 && offset < decoded_bufflen_){ memmove(decoded_buff_, decoded_buff_ + offset, decoded_bufflen_ - offset); } decoded_bufflen_ -= offset; - #if 0 if (decoded_bufflen_ >= max_packet_len_) { //收到超长包 Close(); return; } - #endif } void WebSocketClient::DecodeFrame(char* buf, int& offset, unsigned int buflen) @@ -276,6 +298,21 @@ namespace a8 offset += real_pkg_len; } + void WebSocketClient::DecodePacket(char* buf, int& offset, unsigned int buflen) + { + if (!handshook_) { + buf[buflen] = '\0'; + ProcessHandShake(buf, offset, buflen); + } else { + DecodeFrame(buf, offset, buflen); + } + } + + void WebSocketClient::DecodeUserPacket(char* buf, int& offset, unsigned int buflen) + { + + } + } #endif diff --git a/a8/websocketclient.h b/a8/websocketclient.h index 6c0c97e..97c2fca 100644 --- a/a8/websocketclient.h +++ b/a8/websocketclient.h @@ -29,16 +29,21 @@ namespace a8 void SendBuff(const char* buff, unsigned int bufflen); private: + void DecodePacket(char* buf, int& offset, unsigned int buflen); + void DecodeUserPacket(char* buf, int& offset, unsigned int buflen); + void ProcessHandShake(char* buf, int& offset, unsigned int buflen); void ProcessWsHandShake(char* buf, int& offset, unsigned int buflen); void ProcessUserPacket(); void DecodeFrame(char* buf, int& offset, unsigned int buflen); - private: std::shared_ptr tcp_client_; char *decoded_buff_ = nullptr; int decoded_bufflen_ = 0; bool handshook_ = false; + char *recv_buff_ = nullptr; + int recv_bufflen_ = 0; + int max_packet_len_ = 0; }; }