mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2026-06-18 22:50:59 +00:00
fixed. every. bug.
This commit is contained in:
@@ -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(){
|
||||||
|
|||||||
@@ -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{
|
||||||
|
if(Sent > -1){
|
||||||
Temp = send(CSocket, &Data[Sent], Size - Sent, 0);
|
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
@@ -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());
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user