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

View File

@ -155,6 +155,7 @@ void GameHandler(SOCKET Client){
} else {
debug(Sec("(Core) recv failed with error: ") + std::to_string(WSAGetLastError()));
}
NetReset();
KillSocket(Client);
}
void localRes(){

View File

@ -16,11 +16,20 @@ bool GConnected = false;
bool CServer = true;
extern SOCKET UDPSock;
extern SOCKET TCPSock;
SOCKET CSocket;
SOCKET CSocket = -1;
SOCKET GSocket = -1;
int KillSocket(uint64_t Dead){
if(Dead == (SOCKET)-1){
debug(Sec("Kill socket got -1 returning..."));
return 0;
}
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){
@ -48,7 +57,9 @@ void GameSend(std::string Data){
}
#endif
do{
if(Sent > -1){
Temp = send(CSocket, &Data[Sent], Size - Sent, 0);
}
if(!CheckBytes(Temp))return;
Sent += Temp;
}while(Sent < Size);
@ -84,20 +95,26 @@ void NetReset(){
Terminate = false;
UlStatus = Sec("Ulstart");
MStatus = " ";
if(UDPSock != SOCKET_ERROR){
if(UDPSock != (SOCKET)(-1)){
debug("Terminating UDP Socket : " + std::to_string(TCPSock));
KillSocket(UDPSock);
}
UDPSock = -1;
if(TCPSock != SOCKET_ERROR){
if(TCPSock != (SOCKET)(-1)){
debug("Terminating TCP Socket : " + std::to_string(TCPSock));
KillSocket(TCPSock);
}
TCPSock = -1;
if(GSocket != (SOCKET)(-1)){
debug("Terminating GTCP Socket : " + std::to_string(GSocket));
KillSocket(GSocket);
}
GSocket = -1;
ClearAll();
}
SOCKET SetupListener(){
static SOCKET LSocket = -1;
if(LSocket != -1)return LSocket;
if(GSocket != -1)return GSocket;
struct addrinfo *result = nullptr;
struct addrinfo hints{};
WSADATA wsaData;
@ -116,30 +133,30 @@ SOCKET SetupListener(){
error(Sec("(Proxy) info failed with error: ") + std::to_string(iRes));
WSACleanup();
}
LSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (LSocket == -1) {
GSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (GSocket == -1) {
error(Sec("(Proxy) socket failed with error: ") + std::to_string(WSAGetLastError()));
freeaddrinfo(result);
WSACleanup();
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) {
error(Sec("(Proxy) bind failed with error: ") + std::to_string(WSAGetLastError()));
freeaddrinfo(result);
KillSocket(LSocket);
KillSocket(GSocket);
WSACleanup();
return -1;
}
freeaddrinfo(result);
iRes = listen(LSocket, SOMAXCONN);
iRes = listen(GSocket, SOMAXCONN);
if (iRes == SOCKET_ERROR) {
error(Sec("(Proxy) listen failed with error: ") + std::to_string(WSAGetLastError()));
KillSocket(LSocket);
KillSocket(GSocket);
WSACleanup();
return -1;
}
return LSocket;
return GSocket;
}
void AutoPing(){
while(!Terminate){
@ -183,8 +200,9 @@ void NetMain(const std::string& IP, int Port){
info(Sec("Connection Terminated!"));
}
void TCPGameServer(const std::string& IP, int Port){
SOCKET LSocket = SetupListener();
while (!TCPTerminate && LSocket != -1){
GSocket = SetupListener();
while (!TCPTerminate && GSocket != -1){
debug("MAIN LOOP OF GAME SERVER");
GConnected = false;
if(!CServer){
warn(Sec("Connection still alive terminating"));
@ -197,9 +215,9 @@ void TCPGameServer(const std::string& IP, int Port){
std::thread Client(TCPClientMain, IP, Port);
Client.detach();
}
CSocket = accept(LSocket, nullptr, nullptr);
CSocket = accept(GSocket, nullptr, nullptr);
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;
}
debug(Sec("(Proxy) Game Connected!"));
@ -218,9 +236,9 @@ void TCPGameServer(const std::string& IP, int Port){
do{
Temp = recv(CSocket,&Header[Rcv],1,0);
if(Temp < 1)break;
if(Temp < 1 || TCPTerminate)break;
}while(Header[Rcv++] != '>');
if(Temp < 1)break;
if(Temp < 1 || TCPTerminate)break;
if(std::from_chars(Header,&Header[Rcv],Size).ptr[0] != '>'){
debug(Sec("(Game) Invalid lua Header -> ") + std::string(Header,Rcv));
break;
@ -231,20 +249,18 @@ void TCPGameServer(const std::string& IP, int Port){
Temp = recv(CSocket,&Ret[Rcv],Size-Rcv,0);
if(Temp < 1)break;
Rcv += Temp;
}while(Rcv < Size);
if(Temp < 1)break;
}while(Rcv < Size && !TCPTerminate);
if(Temp < 1 || TCPTerminate)break;
ServerSend(Ret,false);
}while(Temp > 0);
}while(Temp > 0 && !TCPTerminate);
if(Temp == 0)debug(Sec("(Proxy) Connection closing"));
else debug(Sec("(Proxy) recv failed error : ") + std::to_string(WSAGetLastError()));
}
TCPTerminate = true;
GConnected = false;
Terminate = true;
if(LSocket == -1){
UlStatus = Sec("Critical error! check the launcher logs");
}
if(CSocket != SOCKET_ERROR)KillSocket(CSocket);
debug("END OF GAME SERVER");
}

View File

@ -15,6 +15,7 @@
#include <fstream>
#include <string>
#include <thread>
#include <atomic>
#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);
return stream.str();
}
struct Hold{
SOCKET TCPSock{};
bool Done = false;
};
void Check(Hold* S){
std::this_thread::sleep_for(std::chrono::seconds(5));
if(S != nullptr){
if(!S->Done && S->TCPSock != -1){
KillSocket(S->TCPSock);
void Check(SOCKET TCPSock,std::shared_ptr<std::atomic_bool> ok){
size_t accum = 0;
while (!*ok) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
accum += 100;
if (accum >= 5000) {
error(Sec("Identification timed out (Check accum)"));
KillSocket(TCPSock);
return;
}
}
}
@ -128,9 +130,9 @@ std::vector<char> PrependSize(const std::string& str) {
memcpy(result.data() + 4, str.data(), str.size() + 1);
return result;
}
std::string HandShake(SOCKET Sock,Hold*S,RSA*LKey){
S->TCPSock = Sock;
std::thread Timeout(Check,S);
std::string HandShake(SOCKET Sock,RSA*LKey){
std::shared_ptr<std::atomic_bool> ok = std::make_shared<std::atomic_bool>(false);
std::thread Timeout(Check,Sock,ok);
Timeout.detach();
N = 0;E = 0;
auto Res = STCPRecv(Sock);
@ -144,7 +146,7 @@ std::string HandShake(SOCKET Sock,Hold*S,RSA*LKey){
Terminate = true;
}
}else Terminate = true;
S->Done = true;
*ok = true;
if(Terminate){
TCPTerminate = true;
@ -182,10 +184,10 @@ std::string HandShake(SOCKET Sock,Hold*S,RSA*LKey){
void SyncResources(SOCKET Sock){
RSA*LKey = GenKey();
auto* S = new Hold;
std::string Ret = HandShake(Sock,S,LKey);
std::string Ret = HandShake(Sock,LKey);
delete LKey;
delete S;
if(Ret.empty())return;
info(Sec("Checking Resources..."));
@ -224,7 +226,13 @@ void SyncResources(SOCKET Sock){
UlStatus = Sec("UlLoading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) +
"): " + a.substr(a.find_last_of('/'));
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();
continue;
}else remove(a.c_str());

View File

@ -12,8 +12,8 @@
#include <array>
#include <set>
SOCKET UDPSock;
sockaddr_in ToServer{};
SOCKET UDPSock = -1;
sockaddr_in* ToServer = nullptr;
struct PacketData{
int ID;
std::string Data;
@ -60,7 +60,7 @@ void UDPSend(std::string Data){
Data = "ABG:" + CMP;
}
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()));
}
@ -208,10 +208,13 @@ void UDPClientMain(const std::string& IP,int Port){
error(Sec("Can't start Winsock!"));
return;
}
ToServer.sin_family = AF_INET;
ToServer.sin_port = htons(Port);
inet_pton(AF_INET, IP.c_str(), &ToServer.sin_addr);
delete ToServer;
ToServer = new sockaddr_in;
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);
std::thread Ack(LOOP);
Ack.detach();
IDReset();

View File

@ -11,15 +11,14 @@
#include "Security/Enc.h"
#include "Network/network.h"
SOCKET TCPSock;
SOCKET TCPSock = -1;
bool CheckBytes(int32_t Bytes){
if (Bytes == 0){
debug(Sec("(TCP) Connection closing... CheckBytes(16)"));
Terminate = true;
return false;
}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);
Terminate = true;
return false;
@ -95,6 +94,7 @@ void TCPClientMain(const std::string& IP,int Port){
int RetCode;
WSAStartup(514, &wsaData); //2.2
TCPSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(TCPSock == -1){
printf(Sec("Client: socket failed! Error code: %d\n"), WSAGetLastError());
WSACleanup();