1
This commit is contained in:
parent
736500c141
commit
cfdeca99ac
@ -1,5 +1,8 @@
|
|||||||
#include <a8/a8.h>
|
#include <a8/a8.h>
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <a8/udpsession.h>
|
#include <a8/udpsession.h>
|
||||||
|
|
||||||
static const int DEFAULT_MAX_PACKET_LEN = 1024 * 10;
|
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);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
|
||||||
namespace a8
|
namespace a8
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -13,6 +18,13 @@ namespace a8
|
|||||||
|
|
||||||
void Update();
|
void Update();
|
||||||
void SetMaxPacketLen(int max_packet_len);
|
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:
|
private:
|
||||||
a8::UdpListener* listener_ = nullptr;
|
a8::UdpListener* listener_ = nullptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user