From cfdeca99aca94a4b89fd777abd928e51b4535037 Mon Sep 17 00:00:00 2001 From: azw Date: Sat, 22 Apr 2023 09:44:29 +0000 Subject: [PATCH] 1 --- a8/udpsession.cc | 43 +++++++++++++++++++++++++++++++++++++++++++ a8/udpsession.h | 12 ++++++++++++ 2 files changed, 55 insertions(+) diff --git a/a8/udpsession.cc b/a8/udpsession.cc index be80019..028532c 100644 --- a/a8/udpsession.cc +++ b/a8/udpsession.cc @@ -1,5 +1,8 @@ #include +#include +#include + #include static const int DEFAULT_MAX_PACKET_LEN = 1024 * 10; @@ -28,4 +31,44 @@ namespace a8 max_packet_len_ = std::max(max_packet_len, DEFAULT_MAX_PACKET_LEN); } + void UdpSession::OnSocketRead(char* buf, unsigned int buflen) + { + 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_) { + //收到超长包 + #if 0 + Close(); + #endif + return; + } + } while (already_read_bytes < buflen); + } + + void UdpSession::DecodePacket(char* buf, int& offset, unsigned int buflen) + { + DecodeUserPacket(buf, offset, buflen); + } + } diff --git a/a8/udpsession.h b/a8/udpsession.h index a0485ce..a6ef0b5 100644 --- a/a8/udpsession.h +++ b/a8/udpsession.h @@ -1,5 +1,10 @@ #pragma once +#include +#include +#include +#include + namespace a8 { @@ -13,6 +18,13 @@ namespace a8 void Update(); void SetMaxPacketLen(int max_packet_len); + virtual void OnRecvPacket() = 0; + virtual void SendClientMsg(char* buf, int buf_len) = 0; + + protected: + virtual void OnSocketRead(char* buf, unsigned int buflen); + virtual void DecodePacket(char* buf, int& offset, unsigned int buflen); + virtual void DecodeUserPacket(char* buf, int& offset, unsigned int buflen) = 0; private: a8::UdpListener* listener_ = nullptr;