wsproxy/server/wsproxy/kcpsession.cc
2023-04-24 07:23:58 +00:00

115 lines
2.9 KiB
C++

#include "precompile.h"
#include <memory.h>
#include <f8/netmsghandler.h>
#include <f8/udplog.h>
#include "kcpsession.h"
#include "longsessionmgr.h"
#include "app.h"
static const int DEFAULT_MAX_RECV_BUFFERSIZE = 1024 * 64;
static int UdpOutput(const char *buf, int len, ikcpcb *kcp, void *user)
{
KcpSession* session = (KcpSession*)user;
a8::UdpPacket* pkt = new a8::UdpPacket();
pkt->buf = buf;
pkt->buf_len = len;
pkt->remote_addr = session->GetAddr();
LongSessionMgr::Instance()->GetUdpListener()->SendUdpPacket(pkt);
return 0;
}
KcpSession::KcpSession()
{
}
KcpSession::~KcpSession()
{
}
void KcpSession::Init(int socket_handle)
{
socket_handle_ = socket_handle;
secret_key_ = App::Instance()->NewUuid();
kcp_ = ikcp_create(socket_handle_, (void*)this);
ikcp_wndsize(kcp_, 128, 128);
ikcp_nodelay(kcp_, 2, 10, 2, 1);
kcp_->rx_minrto = 10;
kcp_->fastresend = 1;
kcp_->output = UdpOutput;
init_tick_ = a8::XGetTickCount();
}
void KcpSession::UnInit()
{
if (kcp_) {
ikcp_release(kcp_);
kcp_ = nullptr;
}
}
void KcpSession::Update(long long tick)
{
ikcp_update(kcp_, tick - init_tick_);
UpdateInput();
}
void KcpSession::SendClientMsg(char* buf, int buf_len)
{
ikcp_send(kcp_, buf, buf_len);
}
void KcpSession::OnRecvPacket(a8::UdpPacket* pkt)
{
remote_addr_ = pkt->remote_addr;
ikcp_input(kcp_, pkt->buf, pkt->buf_len);
}
void KcpSession::UpdateInput()
{
char buf[DEFAULT_MAX_RECV_BUFFERSIZE];
int buflen = ikcp_recv(kcp_, buf, DEFAULT_MAX_RECV_BUFFERSIZE - 10);
if (buflen <= 0) {
return;
}
OnSocketRead(buf, buflen);
}
void KcpSession::DecodeUserPacket(char* buf, int& offset, unsigned int buflen)
{
//packagelen + msgid + magiccode + msgbody
//2 + 2 + 4+ xx + \0 + xx
bool warning = false;
while (buflen - offset >= sizeof(f8::PackHead) + GetSecretKeyLen()) {
f8::PackHead* p = (f8::PackHead*)&buf[offset + GetSecretKeyLen()];
if (p->magic_code == f8::MAGIC_CODE) {
if (buflen - offset < sizeof(f8::PackHead) + p->packlen + GetSecretKeyLen()) {
break;
}
//a8::XPrintf("Recv MsgId:%d\n", {p->msgid});
App::Instance()->AddSocketMsg(SF_Client,
socket_handle_,
0,
//saddr,
p->msgid,
p->seqid,
&buf[offset + sizeof(f8::PackHead) + GetSecretKeyLen()],
p->packlen);
offset += sizeof(f8::PackHead) + p->packlen;
} else {
warning = true;
offset++;
continue;
}
}
if (warning) {
f8::UdpLog::Instance()->Warning("收到kcp client非法数据包", {});
}
}