diff --git a/server/wsproxy/kcpsession.cc b/server/wsproxy/kcpsession.cc index 1bd9bb8..aaa2e8b 100644 --- a/server/wsproxy/kcpsession.cc +++ b/server/wsproxy/kcpsession.cc @@ -90,8 +90,20 @@ void KcpSession::UpdateInput() void KcpSession::DecodeUserPacket(char* buf, int& offset, unsigned int buflen) { - //packagelen + msgid + magiccode + msgbody - //2 + 2 + 4+ xx + \0 + xx + if (GetSecretKeyPlace()) { + DecodeUserPacketNew(buf, offset, buflen); + } else { + DecodeUserPacketOld(buf, offset, buflen); + } +} + +int KcpSession::GetSecretKeyPlace() +{ + return secret_key_place_; +} + +void KcpSession::DecodeUserPacketOld(char* buf, int& offset, unsigned int buflen) +{ bool warning = false; while (buflen - offset >= sizeof(f8::PackHead) + GetSecretKeyLen()) { long long secret_key = KcpSession::ReadSecretKey(&buf[offset], buflen); @@ -123,11 +135,37 @@ void KcpSession::DecodeUserPacket(char* buf, int& offset, unsigned int buflen) } if (warning) { - f8::UdpLog::Instance()->Warning("收到kcp client非法数据包", {}); + f8::UdpLog::Instance()->Warning("收到kcp client非法数据包1", {}); } } -int KcpSession::GetSecretKeyPlace() +void KcpSession::DecodeUserPacketNew(char* buf, int& offset, unsigned int buflen) { - return secret_key_place_; + bool warning = false; + while (buflen - offset >= sizeof(f8::PackHead)) { + f8::PackHead* p = (f8::PackHead*)&buf[offset]; + if (p->magic_code == f8::MAGIC_CODE) { + if (buflen - offset < sizeof(f8::PackHead) + p->packlen) { + break; + } + App::Instance()->AddSocketMsg(SF_Client, + socket_handle_, + 0, + //saddr, + p->msgid, + p->seqid, + &buf[offset + sizeof(f8::PackHead)], + p->packlen, + ST_Udp); + offset += sizeof(f8::PackHead) + p->packlen; + } else { + warning = true; + offset++; + continue; + } + } + + if (warning) { + f8::UdpLog::Instance()->Warning("收到kcp client非法数据包2", {}); + } } diff --git a/server/wsproxy/kcpsession.h b/server/wsproxy/kcpsession.h index 8a8775c..57578bc 100644 --- a/server/wsproxy/kcpsession.h +++ b/server/wsproxy/kcpsession.h @@ -32,6 +32,8 @@ public: protected: virtual void DecodeUserPacket(char* buf, int& offset, unsigned int buflen) override; + void DecodeUserPacketOld(char* buf, int& offset, unsigned int buflen); + void DecodeUserPacketNew(char* buf, int& offset, unsigned int buflen); private: void UpdateInput(); diff --git a/server/wsproxy/longsessionmgr.cc b/server/wsproxy/longsessionmgr.cc index f66d778..9245421 100644 --- a/server/wsproxy/longsessionmgr.cc +++ b/server/wsproxy/longsessionmgr.cc @@ -133,30 +133,31 @@ void LongSessionMgr::ProcUdpPacket(a8::UdpPacket* pkt) }); return; } - session->GetKcpSession()->OnRecvPacket(pkt); -#if 0 - if (pkt->buf_len > IKCP_OVERHEAD + KcpSession::GetSecretKeyLen()) { - long long secret_key = KcpSession::ReadSecretKey(pkt->buf + IKCP_OVERHEAD, pkt->buf_len); - if (secret_key == session->GetKcpSession()->GetSecretKey()) { - session->GetKcpSession()->OnRecvPacket(pkt); + if (session->GetSecretKeyPlace()) { + if (pkt->buf_len > IKCP_OVERHEAD + KcpSession::GetSecretKeyLen()) { + long long secret_key = KcpSession::ReadSecretKey(pkt->buf + IKCP_OVERHEAD, pkt->buf_len); + if (secret_key == session->GetKcpSession()->GetSecretKey()) { + session->GetKcpSession()->OnRecvPacket(pkt); + } else { + f8::UdpLog::Instance()->Warning("ProcUdpPacket host:%s port:%d socket_handle%d secret_key:%d secret_error", + { + inet_ntoa(pkt->remote_addr.sin_addr), + pkt->remote_addr.sin_port, + socket_handle, + secret_key + }); + } } else { - f8::UdpLog::Instance()->Warning("ProcUdpPacket host:%s port:%d socket_handle%d secret_key:%d secret_error", + f8::UdpLog::Instance()->Warning("ProcUdpPacket host:%s port:%d buflen:%d bufflen_error", { inet_ntoa(pkt->remote_addr.sin_addr), pkt->remote_addr.sin_port, - socket_handle, - secret_key + pkt->buf_len }); } } else { - f8::UdpLog::Instance()->Warning("ProcUdpPacket host:%s port:%d buflen:%d bufflen_error", - { - inet_ntoa(pkt->remote_addr.sin_addr), - pkt->remote_addr.sin_port, - pkt->buf_len - }); + session->GetKcpSession()->OnRecvPacket(pkt); } -#endif } void LongSessionMgr::DelSession(int socket_handle)