UDP Cleanup

This commit is contained in:
Anonymous275 2020-11-25 20:26:43 +02:00
parent 6bf7e95321
commit 1579c8bc29
3 changed files with 1 additions and 160 deletions

View File

@ -6,7 +6,6 @@
void NetReset(); void NetReset();
extern long long ping; extern long long ping;
extern bool Dev; extern bool Dev;
void ClearAll();
extern int ClientID; extern int ClientID;
extern bool ModLoaded; extern bool ModLoaded;
extern bool Terminate; extern bool Terminate;

View File

@ -111,7 +111,6 @@ void NetReset(){
KillSocket(GSocket); KillSocket(GSocket);
} }
GSocket = -1; GSocket = -1;
ClearAll();
} }
SOCKET SetupListener(){ SOCKET SetupListener(){

View File

@ -6,53 +6,12 @@
#include "Security/Enc.h" #include "Security/Enc.h"
#include <WS2tcpip.h> #include <WS2tcpip.h>
#include "Logger.h" #include "Logger.h"
#include <sstream>
#include <thread>
#include <string> #include <string>
#include <array>
#include <set> #include <set>
SOCKET UDPSock = -1; SOCKET UDPSock = -1;
sockaddr_in* ToServer = nullptr; sockaddr_in* ToServer = nullptr;
struct PacketData{
int ID;
std::string Data;
int Tries;
};
struct SplitData{
int Total{};
int ID{};
std::set<std::pair<int,std::string>> Fragments;
};
std::set<SplitData*> SplitPackets;
std::set<PacketData*> BigDataAcks;
int FC(const std::string& s,const std::string& p,int n) {
auto i = s.find(p);
int j;
for (j = 1; j < n && i != std::string::npos; ++j){
i = s.find(p, i+1);
}
if (j == n)return int(i);
else return -1;
}
void ClearAll(){
__try{
for (SplitData*S : SplitPackets){
if (S != nullptr) {
delete S;
S = nullptr;
}
}
for (PacketData*S : BigDataAcks){
if (S != nullptr) {
delete S;
S = nullptr;
}
}
}__except(1){}
SplitPackets.clear();
BigDataAcks.clear();
}
void UDPSend(std::string Data){ void UDPSend(std::string Data){
if(ClientID == -1 || UDPSock == -1)return; if(ClientID == -1 || UDPSock == -1)return;
if(Data.length() > 400){ if(Data.length() > 400){
@ -64,45 +23,7 @@ void UDPSend(std::string Data){
if (sendOk == SOCKET_ERROR)error(Sec("Error Code : ") + std::to_string(WSAGetLastError())); if (sendOk == SOCKET_ERROR)error(Sec("Error Code : ") + std::to_string(WSAGetLastError()));
} }
void LOOP(){
while(UDPSock != -1) {
for (PacketData* p : BigDataAcks) {
if(p != nullptr && p->Tries < 15){
p->Tries++;
UDPSend(p->Data);
}else{
BigDataAcks.erase(p);
if(p != nullptr){
delete p;
p = nullptr;
}
break;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(300));
}
}
void AckID(int ID){
for(PacketData* p : BigDataAcks){
if(p != nullptr && p->ID == ID){
p->Tries = 100;
break;
}
}
}
int PackID(){
static int ID = -1;
if(ID > 999999)ID = 0;
else ID++;
return ID;
}
int SplitID(){
static int SID = -1;
if(SID > 999999)SID = 0;
else SID++;
return SID;
}
void SendLarge(std::string Data){ void SendLarge(std::string Data){
if(Data.length() > 400){ if(Data.length() > 400){
std::string CMP(Comp(Data)); std::string CMP(Comp(Data));
@ -110,86 +31,11 @@ void SendLarge(std::string Data){
} }
TCPSend(Data); TCPSend(Data);
} }
std::array<int, 100> HandledIDs = {-1};
int APos = 0;
void IDReset(){
for(int C = 0;C < 100;C++){
HandledIDs.at(C) = -1;
}
}
bool Handled(int ID){
for(int id : HandledIDs){
if(id == ID)return true;
}
if(APos > 99)APos = 0;
HandledIDs.at(APos) = ID;
APos++;
return false;
}
SplitData*GetSplit(int SplitID){
for(SplitData* a : SplitPackets){
if(a != nullptr && a->ID == SplitID)return a;
}
auto* a = new SplitData();
SplitPackets.insert(a);
return a;
}
void HandleChunk(const std::string&Data){
int pos = FC(Data,"|",5);
if(pos == -1)return;
std::stringstream ss(Data.substr(0,pos++));
std::string t;
int I = -1;
//Current Max ID SID
std::vector<int> Num(4,0);
while (std::getline(ss, t, '|')) {
if(I != -1)Num.at(I) = std::stoi(t);
I++;
}
std::string ack = "TRG:" + std::to_string(Num.at(2));
UDPSend(ack);
if(Handled(Num.at(2))){
return;
}
std::string Packet = Data.substr(pos);
SplitData* SData = GetSplit(Num.at(3));
SData->Total = Num.at(1);
SData->ID = Num.at(3);
SData->Fragments.insert(std::make_pair(Num.at(0),Packet));
if(SData->Fragments.size() == SData->Total){
std::string ToHandle;
for(const std::pair<int,std::string>& a : SData->Fragments){
ToHandle += a.second;
}
ServerParser(ToHandle);
SplitPackets.erase(SData);
delete SData;
SData = nullptr;
}
}
void UDPParser(std::string Packet){ void UDPParser(std::string Packet){
if(Packet.substr(0,4) == "ABG:"){ if(Packet.substr(0,4) == "ABG:"){
Packet = DeComp(Packet.substr(4)); Packet = DeComp(Packet.substr(4));
} }
if(Packet.substr(0,4) == "TRG:"){
AckID(stoi(Packet.substr(4)));
return;
}else if(Packet.substr(0,3) == "BD:"){
auto pos = Packet.find(':',4);
int ID = stoi(Packet.substr(3,pos-3));
std::string pckt = "TRG:" + std::to_string(ID);
UDPSend(pckt);
if(!Handled(ID)) {
pckt = Packet.substr(pos + 1);
ServerParser(pckt);
}
return;
}else if(Packet.substr(0,2) == "SC"){
HandleChunk(Packet);
return;
}
ServerParser(Packet); ServerParser(Packet);
} }
void UDPRcv(){ void UDPRcv(){
@ -215,9 +61,6 @@ void UDPClientMain(const std::string& IP,int Port){
inet_pton(AF_INET, IP.c_str(), &ToServer->sin_addr); inet_pton(AF_INET, IP.c_str(), &ToServer->sin_addr);
UDPSock = socket(AF_INET, SOCK_DGRAM, 0); UDPSock = socket(AF_INET, SOCK_DGRAM, 0);
std::thread Ack(LOOP);
Ack.detach();
IDReset();
TCPSend(Sec("P")); TCPSend(Sec("P"));
UDPSend(Sec("p")); UDPSend(Sec("p"));
while(!Terminate)UDPRcv(); while(!Terminate)UDPRcv();