fixed. every. bug.

This commit is contained in:
Anonymous275
2020-11-13 21:23:18 +02:00
parent d5466bb68a
commit 97cc5a3179
5 changed files with 80 additions and 52 deletions
+1
View File
@@ -155,6 +155,7 @@ void GameHandler(SOCKET Client){
} else { } else {
debug(Sec("(Core) recv failed with error: ") + std::to_string(WSAGetLastError())); debug(Sec("(Core) recv failed with error: ") + std::to_string(WSAGetLastError()));
} }
NetReset();
KillSocket(Client); KillSocket(Client);
} }
void localRes(){ void localRes(){
+42 -26
View File
@@ -16,11 +16,20 @@ bool GConnected = false;
bool CServer = true; bool CServer = true;
extern SOCKET UDPSock; extern SOCKET UDPSock;
extern SOCKET TCPSock; extern SOCKET TCPSock;
SOCKET CSocket; SOCKET CSocket = -1;
SOCKET GSocket = -1;
int KillSocket(uint64_t Dead){ int KillSocket(uint64_t Dead){
if(Dead == (SOCKET)-1){
debug(Sec("Kill socket got -1 returning..."));
return 0;
}
shutdown(Dead,SD_BOTH); shutdown(Dead,SD_BOTH);
return closesocket(Dead); int a = closesocket(Dead);
if(a != 0){
warn(Sec("Failed to close socket!"));
}
return a;
} }
bool CheckBytes(uint32_t Bytes){ bool CheckBytes(uint32_t Bytes){
@@ -48,7 +57,9 @@ void GameSend(std::string Data){
} }
#endif #endif
do{ do{
Temp = send(CSocket, &Data[Sent], Size - Sent, 0); if(Sent > -1){
Temp = send(CSocket, &Data[Sent], Size - Sent, 0);
}
if(!CheckBytes(Temp))return; if(!CheckBytes(Temp))return;
Sent += Temp; Sent += Temp;
}while(Sent < Size); }while(Sent < Size);
@@ -84,20 +95,26 @@ void NetReset(){
Terminate = false; Terminate = false;
UlStatus = Sec("Ulstart"); UlStatus = Sec("Ulstart");
MStatus = " "; MStatus = " ";
if(UDPSock != SOCKET_ERROR){ if(UDPSock != (SOCKET)(-1)){
debug("Terminating UDP Socket : " + std::to_string(TCPSock));
KillSocket(UDPSock); KillSocket(UDPSock);
} }
UDPSock = -1; UDPSock = -1;
if(TCPSock != SOCKET_ERROR){ if(TCPSock != (SOCKET)(-1)){
debug("Terminating TCP Socket : " + std::to_string(TCPSock));
KillSocket(TCPSock); KillSocket(TCPSock);
} }
TCPSock = -1; TCPSock = -1;
if(GSocket != (SOCKET)(-1)){
debug("Terminating GTCP Socket : " + std::to_string(GSocket));
KillSocket(GSocket);
}
GSocket = -1;
ClearAll(); ClearAll();
} }
SOCKET SetupListener(){ SOCKET SetupListener(){
static SOCKET LSocket = -1; if(GSocket != -1)return GSocket;
if(LSocket != -1)return LSocket;
struct addrinfo *result = nullptr; struct addrinfo *result = nullptr;
struct addrinfo hints{}; struct addrinfo hints{};
WSADATA wsaData; WSADATA wsaData;
@@ -116,30 +133,30 @@ SOCKET SetupListener(){
error(Sec("(Proxy) info failed with error: ") + std::to_string(iRes)); error(Sec("(Proxy) info failed with error: ") + std::to_string(iRes));
WSACleanup(); WSACleanup();
} }
LSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); GSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (LSocket == -1) { if (GSocket == -1) {
error(Sec("(Proxy) socket failed with error: ") + std::to_string(WSAGetLastError())); error(Sec("(Proxy) socket failed with error: ") + std::to_string(WSAGetLastError()));
freeaddrinfo(result); freeaddrinfo(result);
WSACleanup(); WSACleanup();
return -1; return -1;
} }
iRes = bind(LSocket, result->ai_addr, (int) result->ai_addrlen); iRes = bind(GSocket, result->ai_addr, (int) result->ai_addrlen);
if (iRes == SOCKET_ERROR) { if (iRes == SOCKET_ERROR) {
error(Sec("(Proxy) bind failed with error: ") + std::to_string(WSAGetLastError())); error(Sec("(Proxy) bind failed with error: ") + std::to_string(WSAGetLastError()));
freeaddrinfo(result); freeaddrinfo(result);
KillSocket(LSocket); KillSocket(GSocket);
WSACleanup(); WSACleanup();
return -1; return -1;
} }
freeaddrinfo(result); freeaddrinfo(result);
iRes = listen(LSocket, SOMAXCONN); iRes = listen(GSocket, SOMAXCONN);
if (iRes == SOCKET_ERROR) { if (iRes == SOCKET_ERROR) {
error(Sec("(Proxy) listen failed with error: ") + std::to_string(WSAGetLastError())); error(Sec("(Proxy) listen failed with error: ") + std::to_string(WSAGetLastError()));
KillSocket(LSocket); KillSocket(GSocket);
WSACleanup(); WSACleanup();
return -1; return -1;
} }
return LSocket; return GSocket;
} }
void AutoPing(){ void AutoPing(){
while(!Terminate){ while(!Terminate){
@@ -183,8 +200,9 @@ void NetMain(const std::string& IP, int Port){
info(Sec("Connection Terminated!")); info(Sec("Connection Terminated!"));
} }
void TCPGameServer(const std::string& IP, int Port){ void TCPGameServer(const std::string& IP, int Port){
SOCKET LSocket = SetupListener(); GSocket = SetupListener();
while (!TCPTerminate && LSocket != -1){ while (!TCPTerminate && GSocket != -1){
debug("MAIN LOOP OF GAME SERVER");
GConnected = false; GConnected = false;
if(!CServer){ if(!CServer){
warn(Sec("Connection still alive terminating")); warn(Sec("Connection still alive terminating"));
@@ -197,9 +215,9 @@ void TCPGameServer(const std::string& IP, int Port){
std::thread Client(TCPClientMain, IP, Port); std::thread Client(TCPClientMain, IP, Port);
Client.detach(); Client.detach();
} }
CSocket = accept(LSocket, nullptr, nullptr); CSocket = accept(GSocket, nullptr, nullptr);
if (CSocket == -1) { if (CSocket == -1) {
error(Sec("(Proxy) accept failed with error: ") + std::to_string(WSAGetLastError())); debug(Sec("(Proxy) accept failed with error: ") + std::to_string(WSAGetLastError()));
break; break;
} }
debug(Sec("(Proxy) Game Connected!")); debug(Sec("(Proxy) Game Connected!"));
@@ -218,9 +236,9 @@ void TCPGameServer(const std::string& IP, int Port){
do{ do{
Temp = recv(CSocket,&Header[Rcv],1,0); Temp = recv(CSocket,&Header[Rcv],1,0);
if(Temp < 1)break; if(Temp < 1 || TCPTerminate)break;
}while(Header[Rcv++] != '>'); }while(Header[Rcv++] != '>');
if(Temp < 1)break; if(Temp < 1 || TCPTerminate)break;
if(std::from_chars(Header,&Header[Rcv],Size).ptr[0] != '>'){ if(std::from_chars(Header,&Header[Rcv],Size).ptr[0] != '>'){
debug(Sec("(Game) Invalid lua Header -> ") + std::string(Header,Rcv)); debug(Sec("(Game) Invalid lua Header -> ") + std::string(Header,Rcv));
break; break;
@@ -231,20 +249,18 @@ void TCPGameServer(const std::string& IP, int Port){
Temp = recv(CSocket,&Ret[Rcv],Size-Rcv,0); Temp = recv(CSocket,&Ret[Rcv],Size-Rcv,0);
if(Temp < 1)break; if(Temp < 1)break;
Rcv += Temp; Rcv += Temp;
}while(Rcv < Size); }while(Rcv < Size && !TCPTerminate);
if(Temp < 1)break; if(Temp < 1 || TCPTerminate)break;
ServerSend(Ret,false); ServerSend(Ret,false);
}while(Temp > 0); }while(Temp > 0 && !TCPTerminate);
if(Temp == 0)debug(Sec("(Proxy) Connection closing")); if(Temp == 0)debug(Sec("(Proxy) Connection closing"));
else debug(Sec("(Proxy) recv failed error : ") + std::to_string(WSAGetLastError())); else debug(Sec("(Proxy) recv failed error : ") + std::to_string(WSAGetLastError()));
} }
TCPTerminate = true; TCPTerminate = true;
GConnected = false; GConnected = false;
Terminate = true; Terminate = true;
if(LSocket == -1){
UlStatus = Sec("Critical error! check the launcher logs");
}
if(CSocket != SOCKET_ERROR)KillSocket(CSocket); if(CSocket != SOCKET_ERROR)KillSocket(CSocket);
debug("END OF GAME SERVER");
} }
+25 -17
View File
@@ -15,6 +15,7 @@
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <thread> #include <thread>
#include <atomic>
#include <vector> #include <vector>
@@ -107,15 +108,16 @@ std::string GenerateM(RSA*key){
stream << std::hex << key->n << "g" << key->e << "g" << RSA_E(Sec("IDC"),key->e,key->n); stream << std::hex << key->n << "g" << key->e << "g" << RSA_E(Sec("IDC"),key->e,key->n);
return stream.str(); return stream.str();
} }
struct Hold{
SOCKET TCPSock{}; void Check(SOCKET TCPSock,std::shared_ptr<std::atomic_bool> ok){
bool Done = false; size_t accum = 0;
}; while (!*ok) {
void Check(Hold* S){ std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::seconds(5)); accum += 100;
if(S != nullptr){ if (accum >= 5000) {
if(!S->Done && S->TCPSock != -1){ error(Sec("Identification timed out (Check accum)"));
KillSocket(S->TCPSock); KillSocket(TCPSock);
return;
} }
} }
} }
@@ -128,9 +130,9 @@ std::vector<char> PrependSize(const std::string& str) {
memcpy(result.data() + 4, str.data(), str.size() + 1); memcpy(result.data() + 4, str.data(), str.size() + 1);
return result; return result;
} }
std::string HandShake(SOCKET Sock,Hold*S,RSA*LKey){ std::string HandShake(SOCKET Sock,RSA*LKey){
S->TCPSock = Sock; std::shared_ptr<std::atomic_bool> ok = std::make_shared<std::atomic_bool>(false);
std::thread Timeout(Check,S); std::thread Timeout(Check,Sock,ok);
Timeout.detach(); Timeout.detach();
N = 0;E = 0; N = 0;E = 0;
auto Res = STCPRecv(Sock); auto Res = STCPRecv(Sock);
@@ -144,7 +146,7 @@ std::string HandShake(SOCKET Sock,Hold*S,RSA*LKey){
Terminate = true; Terminate = true;
} }
}else Terminate = true; }else Terminate = true;
S->Done = true; *ok = true;
if(Terminate){ if(Terminate){
TCPTerminate = true; TCPTerminate = true;
@@ -182,10 +184,10 @@ std::string HandShake(SOCKET Sock,Hold*S,RSA*LKey){
void SyncResources(SOCKET Sock){ void SyncResources(SOCKET Sock){
RSA*LKey = GenKey(); RSA*LKey = GenKey();
auto* S = new Hold;
std::string Ret = HandShake(Sock,S,LKey); std::string Ret = HandShake(Sock,LKey);
delete LKey; delete LKey;
delete S;
if(Ret.empty())return; if(Ret.empty())return;
info(Sec("Checking Resources...")); info(Sec("Checking Resources..."));
@@ -224,7 +226,13 @@ void SyncResources(SOCKET Sock){
UlStatus = Sec("UlLoading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) + UlStatus = Sec("UlLoading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) +
"): " + a.substr(a.find_last_of('/')); "): " + a.substr(a.find_last_of('/'));
std::this_thread::sleep_for(std::chrono::milliseconds(50)); std::this_thread::sleep_for(std::chrono::milliseconds(50));
fs::copy_file(a, Sec("BeamNG/mods")+a.substr(a.find_last_of('/')), fs::copy_options::overwrite_existing); try {
fs::copy_file(a, Sec("BeamNG/mods") + a.substr(a.find_last_of('/')),
fs::copy_options::overwrite_existing);
} catch (...) {
Terminate = true;
continue;
}
WaitForConfirm(); WaitForConfirm();
continue; continue;
}else remove(a.c_str()); }else remove(a.c_str());
+9 -6
View File
@@ -12,8 +12,8 @@
#include <array> #include <array>
#include <set> #include <set>
SOCKET UDPSock; SOCKET UDPSock = -1;
sockaddr_in ToServer{}; sockaddr_in* ToServer = nullptr;
struct PacketData{ struct PacketData{
int ID; int ID;
std::string Data; std::string Data;
@@ -60,7 +60,7 @@ void UDPSend(std::string Data){
Data = "ABG:" + CMP; Data = "ABG:" + CMP;
} }
std::string Packet = char(ClientID+1) + std::string(":") + Data; std::string Packet = char(ClientID+1) + std::string(":") + Data;
int sendOk = sendto(UDPSock, Packet.c_str(), int(Packet.size()), 0, (sockaddr*)&ToServer, sizeof(ToServer)); int sendOk = sendto(UDPSock, Packet.c_str(), int(Packet.size()), 0, (sockaddr*)ToServer, sizeof(*ToServer));
if (sendOk == SOCKET_ERROR)error(Sec("Error Code : ") + std::to_string(WSAGetLastError())); if (sendOk == SOCKET_ERROR)error(Sec("Error Code : ") + std::to_string(WSAGetLastError()));
} }
@@ -208,10 +208,13 @@ void UDPClientMain(const std::string& IP,int Port){
error(Sec("Can't start Winsock!")); error(Sec("Can't start Winsock!"));
return; return;
} }
ToServer.sin_family = AF_INET; delete ToServer;
ToServer.sin_port = htons(Port); ToServer = new sockaddr_in;
inet_pton(AF_INET, IP.c_str(), &ToServer.sin_addr); ToServer->sin_family = AF_INET;
ToServer->sin_port = htons(Port);
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); std::thread Ack(LOOP);
Ack.detach(); Ack.detach();
IDReset(); IDReset();
+3 -3
View File
@@ -11,15 +11,14 @@
#include "Security/Enc.h" #include "Security/Enc.h"
#include "Network/network.h" #include "Network/network.h"
SOCKET TCPSock; SOCKET TCPSock = -1;
bool CheckBytes(int32_t Bytes){ bool CheckBytes(int32_t Bytes){
if (Bytes == 0){ if (Bytes == 0){
debug(Sec("(TCP) Connection closing... CheckBytes(16)")); debug(Sec("(TCP) Connection closing... CheckBytes(16)"));
Terminate = true; Terminate = true;
return false; return false;
}else if (Bytes < 0) { }else if (Bytes < 0) {
debug(Sec("(TCP) recv failed with error: ") + std::to_string(WSAGetLastError())); debug(Sec("(TCP CB) recv failed with error: ") + std::to_string(WSAGetLastError()));
KillSocket(TCPSock); KillSocket(TCPSock);
Terminate = true; Terminate = true;
return false; return false;
@@ -95,6 +94,7 @@ void TCPClientMain(const std::string& IP,int Port){
int RetCode; int RetCode;
WSAStartup(514, &wsaData); //2.2 WSAStartup(514, &wsaData); //2.2
TCPSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); TCPSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(TCPSock == -1){ if(TCPSock == -1){
printf(Sec("Client: socket failed! Error code: %d\n"), WSAGetLastError()); printf(Sec("Client: socket failed! Error code: %d\n"), WSAGetLastError());
WSACleanup(); WSACleanup();