Major rewrite of the network

This commit is contained in:
Anonymous275 committed 2020-05-10 23:37:29 +03:00
1 parent a132fd7b9f
commit 042671b146
31 files changed
+6314 -6211

No files matched your search

+6 -6
View File
@@ -1,14 +1,14 @@
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/curl)
project(BeamMP-Launcher) project(BeamMP-Launcher)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
add_executable(BeamMP-Launcher main.cpp VehicleNetwork.cpp proxy.cpp Security.cpp http.cpp Discord.cpp UpdateCheck.cpp CoreNetwork.cpp Resources.cpp Compressor.cpp VehicleNetwork.cpp GameStart.cpp) file(GLOB source_files
"src/*.cpp" "src/include/*.h"
"src/include/*.hpp" "src/curl/*.h"
"src/Network 2.0/*.cpp" "src/Network 2.0/*.h")
add_executable(BeamMP-Launcher ${source_files})
target_link_libraries(BeamMP-Launcher discord-rpc libcurl_a zlibstatic) target_link_libraries(BeamMP-Launcher discord-rpc libcurl_a zlibstatic)
-162
View File
@@ -1,162 +0,0 @@
///
/// Created by Anonymous275 on 4/11/2020
///
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ws2tcpip.h>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <filesystem>
namespace fs = std::experimental::filesystem;
void Exit(const std::string& Msg);
extern bool MPDEV;
std::string UlStatus = "Ulstart";
std::string MStatus = " ";
std::vector<std::string> Split(const std::string& String,const std::string& delimiter){
std::vector<std::string> Val;
size_t pos = 0;
std::string token,s = String;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
Val.push_back(token);
s.erase(0, pos + delimiter.length());
}
Val.push_back(s);
return Val;
}
void ProxyThread(const std::string& IP, int port);
void SyncResources(const std::string&IP,int Port){
if(MPDEV)std::cout << "Called" << std::endl;
std::string FileList;
struct stat info{};
if(stat( "Resources", &info) != 0){
_wmkdir(L"Resources");
}
WSADATA wsaData;
SOCKET SendingSocket;
SOCKADDR_IN ServerAddr, ThisSenderInfo;
int RetCode;
int BytesSent, nlen;
WSAStartup(MAKEWORD(2,2), &wsaData);
SendingSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(SendingSocket == INVALID_SOCKET)
{
if(MPDEV)printf("Client: socket() failed! Error code: %d\n", WSAGetLastError());
WSACleanup();
return;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr(IP.c_str());
RetCode = connect(SendingSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
if(RetCode != 0)
{
if(MPDEV)printf("Client: connect() failed! Error code: %ld\n", WSAGetLastError());
closesocket(SendingSocket);
WSACleanup();
return;
}
getsockname(SendingSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
BytesSent = send(SendingSocket, "a", 1, 0);
int iResult;
char recvbuf[65535];
int recvbuflen = 65535;
do {
iResult = recv(SendingSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
std::string File, Data = recvbuf,Response,toSend;
Data.resize(iResult);
std::vector<std::string> list = Split(Data,";");
std::vector<std::string> FileNames(list.begin(),list.begin() + (list.size()/2));
std::vector<std::string> FileSizes(list.begin() + (list.size()/2), list.end());
list.clear();
Data.clear();
Data.resize(recvbuflen);
int index = 0;
for(const std::string& a : FileNames){
if(a.empty() || a.length() < 2)continue;
if(stat(a.c_str(),&info)==0){
if(fs::file_size(a)==std::stoi(FileSizes.at(index))){
index++;
continue;
}else remove(a.c_str());
}
std::ofstream LFS;
LFS.open(a.c_str());
LFS.close();
toSend = "b"+a;
//std::cout << a << std::endl;
send(SendingSocket, toSend.c_str(), toSend.length(), 0);
LFS.open (a.c_str(), std::ios_base::app | std::ios::binary);
do{
iResult = recv(SendingSocket, recvbuf, recvbuflen, 0);
if(iResult < 0){File.clear(); break;}
Data.resize(iResult);
memcpy(&Data[0],recvbuf,iResult);
if(Data.find("Cannot Open") != std::string::npos){File.clear();break;}
LFS << Data;
float per = LFS.tellp()/std::stof(FileSizes.at(index))*100;
std::string Percent = std::to_string(truncf(per*10)/10);
UlStatus="UlDownloading Resource: "+a.substr(a.find_last_of('/'))+" ("+Percent.substr(0,Percent.find('.')+2)+"%)";
//std::cout << UlStatus << std::endl;
}while(LFS.tellp() != std::stoi(FileSizes.at(index)));
LFS.close();
File.clear();
}
toSend = "M";
send(SendingSocket, toSend.c_str(), toSend.length(), 0);
iResult = recv(SendingSocket, recvbuf, recvbuflen, 0);
if(iResult < 0)break;
Data.resize(iResult);
memcpy(&Data[0],recvbuf,iResult);
MStatus = "M" + Data;
break;
}
else if (iResult == 0)
if(MPDEV)printf("Connection closing...\n");
else {
if(MPDEV)printf("(Resources) recv failed with error: %d\n", WSAGetLastError());
closesocket(SendingSocket);
break;
}
}while (iResult > 0);
if(BytesSent == SOCKET_ERROR)
if(MPDEV)printf("Client: send() error %d.\n", WSAGetLastError());
if( shutdown(SendingSocket, SD_SEND) != 0)
if(MPDEV)printf("Client: Well, there is something wrong with the shutdown() The error code: %d\n", WSAGetLastError());
if(closesocket(SendingSocket) != 0)
if(MPDEV)printf("Client: Cannot close \"SendingSocket\" socket. Error code: %d\n", WSAGetLastError());
if(WSACleanup() != 0)
if(MPDEV)printf("Client: WSACleanup() failed!...\n");
UlStatus = "Uldone";
std::cout << "Done!" << std::endl;
ProxyThread(IP,Port);
}
-5909
View File
File diff suppressed because it is too large. Load diff
File renamed without changes.
+3 -5
View File
@@ -10,9 +10,6 @@
extern int DEFAULT_PORT; extern int DEFAULT_PORT;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-noreturn"
std::string HTTP_REQUEST(const std::string&url,int port); std::string HTTP_REQUEST(const std::string&url,int port);
void SyncResources(const std::string& IP, int port); void SyncResources(const std::string& IP, int port);
void Exit(const std::string& Msg); void Exit(const std::string& Msg);
@@ -22,9 +19,10 @@ extern int ping;
extern bool Terminate; extern bool Terminate;
extern bool TCPTerminate; extern bool TCPTerminate;
extern bool MPDEV; extern bool MPDEV;
void StartSync(const std::string &Data){ void StartSync(const std::string &Data){
std::thread t1(SyncResources,Data.substr(1,Data.find(':')-1),std::stoi(Data.substr(Data.find(':')+1))); //std::thread t1(SyncResources,Data.substr(1,Data.find(':')-1),std::stoi(Data.substr(Data.find(':')+1)));
//std::thread t1(SyncResources,"127.0.0.1",30814); std::thread t1(SyncResources,"127.0.0.1",30814);
t1.detach(); t1.detach();
} }
+1 -2
View File
@@ -13,7 +13,6 @@
#include <vector> #include <vector>
extern bool MPDEV; extern bool MPDEV;
static const char* APPLICATION_ID = "629743237988352010"; static const char* APPLICATION_ID = "629743237988352010";
static int FrustrationLevel = 0;
static int64_t StartTime; static int64_t StartTime;
static int SendPresence = 1; static int SendPresence = 1;
static std::vector<std::string> LocalInfo; static std::vector<std::string> LocalInfo;
@@ -126,7 +125,7 @@ static void discordInit()
Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL); Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL);
} }
static void Loop() [[noreturn]] static void Loop()
{ {
char line[512]; char line[512];
char* space; char* space;
+4 -3
View File
@@ -1,10 +1,9 @@
/// ///
/// Created by Anonymous275 on 5/2/2020 /// Created by Anonymous275 on 5/2/2020
/// ///
#include <windows.h> #include <Windows.h>
#include <iostream> #include <iostream>
#include <thread> #include <thread>
#include <string>
std::string QueryKey(HKEY hKey,int ID); std::string QueryKey(HKEY hKey,int ID);
void SystemExec(const std::string&cmd); void SystemExec(const std::string&cmd);
@@ -37,5 +36,7 @@ void StartGame(const std::string&ExeDir,const std::string&Current){
std::thread RB(RollBack,Write(Current)); std::thread RB(RollBack,Write(Current));
RB.detach(); RB.detach();
SystemExec(ExeDir + " -nocrashreport"); SystemExec(ExeDir + " -nocrashreport");
Exit("Game Closed!"); std::cout << "\nGame Closed! launcher closing in 5 secs\n";
std::this_thread::sleep_for(std::chrono::seconds(5));
exit(2);
} }
+64 -111
View File
@@ -1,37 +1,29 @@
//// ////
//// Created by Anonymous275 on 3/3/2020. //// Created by Anonymous275 on 3/3/2020.
//// ////
#define ENET_IMPLEMENTATION #define ENET_IMPLEMENTATION
#include <condition_variable> #include <condition_variable>
#include "include/enet.hpp"
#include <WinSock2.h> #include <WinSock2.h>
#include <WS2tcpip.h> #include <WS2tcpip.h>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <thread> #include <thread>
#include <queue> #include <vector>
int ClientID = -1;
extern int DEFAULT_PORT; extern int DEFAULT_PORT;
typedef struct {
ENetHost *host;
ENetPeer *peer;
} Client;
std::vector<std::string> Split(const std::string& String,const std::string& delimiter);
std::chrono::time_point<std::chrono::steady_clock> PingStart,PingEnd; std::chrono::time_point<std::chrono::steady_clock> PingStart,PingEnd;
extern std::vector<std::string> GlobalInfo; extern std::vector<std::string> GlobalInfo;
bool TCPTerminate = false; bool TCPTerminate = false;
bool Terminate = false; bool Terminate = false;
bool CServer = true; bool CServer = true;
ENetPeer*ServerPeer;
SOCKET*ClientSocket; SOCKET*ClientSocket;
extern bool MPDEV; extern bool MPDEV;
int ping = 0; int ping = 0;
[[noreturn]] void CoreNetworkThread(); void GameSend(const std::string&Data){
void TCPSEND(const std::string&Data){
if(!TCPTerminate) { if(!TCPTerminate) {
int iSendResult = send(*ClientSocket, (Data + "\n").c_str(), int(Data.length()) + 1, 0); int iSendResult = send(*ClientSocket, (Data + "\n").c_str(), int(Data.length()) + 1, 0);
if (iSendResult == SOCKET_ERROR) { if (iSendResult == SOCKET_ERROR) {
@@ -45,121 +37,97 @@ void TCPSEND(const std::string&Data){
} }
} }
} }
void RUDPSEND(const std::string&Data,bool Rel){ void TCPSend(const std::string&Data);
if(!Terminate && ServerPeer != nullptr){ void UDPSend(const std::string&Data);
void ServerSend(const std::string&Data, bool Rel){
if(!Terminate){
char C = 0; char C = 0;
if(Data.length() > 3)C = Data.at(0); if(Data.length() > 3)C = Data.at(0);
if (C == 'O' || C == 'T')Rel = true; if (C == 'O' || C == 'T')Rel = true;
enet_peer_send(ServerPeer, 0, enet_packet_create(Data.c_str(), Data.length()+1, Rel?1:8));
if(Rel)TCPSend(Data);
else UDPSend(Data);
if (MPDEV && Data.length() > 1000) { if (MPDEV && Data.length() > 1000) {
std::cout << "(Launcher->Server) Bytes sent: " << Data.length() std::cout << "(Launcher->Server) Bytes sent: " << Data.length()
<< " : " << " : "
<< Data.substr(0, 10) << Data.substr(0, 10)
<< Data.substr(Data.length() - 10) << std::endl; << Data.substr(Data.length() - 10) << std::endl;
}else if(MPDEV){ }else if(MPDEV && C == 'Z'){
std::cout << "(Game->Launcher) : " << Data << std::endl; //std::cout << "(Game->Launcher) : " << Data << std::endl;
} }
} }
} }
void NameRespond(){ void NameRespond(){
std::string Packet = "NR" + GlobalInfo.at(0)+":"+GlobalInfo.at(2); std::string Packet = "NR" + GlobalInfo.at(0)+":"+GlobalInfo.at(2);
RUDPSEND(Packet,true); ServerSend(Packet,true);
} }
void AutoPing(ENetPeer*peer){ void AutoPing(){
while(!Terminate && peer != nullptr){ while(!Terminate){
RUDPSEND("p",true); ServerSend("p",false);
PingStart = std::chrono::high_resolution_clock::now(); PingStart = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::seconds (1)); std::this_thread::sleep_for(std::chrono::seconds (1));
} }
} }
void RUDPParser(const std::string& Data){ std::string UlStatus = "Ulstart";
std::string MStatus = " ";
void ServerParser(const std::string& Data){
char Code = Data.at(0),SubCode = 0; char Code = Data.at(0),SubCode = 0;
if(Data.length() > 1)SubCode = Data.at(1); if(Data.length() > 1)SubCode = Data.at(1);
switch (Code) { switch (Code) {
case 'P':
ClientID = std::stoi(Data.substr(1));
break;
case 'p': case 'p':
PingEnd = std::chrono::high_resolution_clock::now(); PingEnd = std::chrono::high_resolution_clock::now();
ping = int(std::chrono::duration_cast<std::chrono::microseconds>(PingEnd-PingStart).count())/1000; ping = std::chrono::duration_cast<std::chrono::milliseconds>(PingEnd-PingStart).count();
return; return;
case 'N': case 'N':
if(SubCode == 'R')NameRespond(); if(SubCode == 'R')NameRespond();
return; return;
case 'M':
MStatus = Data;
UlStatus = "Uldone";
return;
} }
///std::cout << "Received: " << Data << std::endl; GameSend(Data);
TCPSEND(Data);
} }
void HandleEvent(ENetEvent event,Client client){ void TCPClientMain(const std::string& IP,int Port);
switch (event.type){ void UDPClientMain(const std::string& IP,int Port);
case ENET_EVENT_TYPE_CONNECT: void NetMain(const std::string& IP, int Port){
std::cout << "Connected to server!" << std::endl; std::thread Ping(AutoPing);
//printf("Client Connected port : %u.\n",event.peer->address.port);
event.peer->data = (void*)"Connected Server";
break;
case ENET_EVENT_TYPE_RECEIVE:
RUDPParser((char*)event.packet->data);
enet_packet_destroy(event.packet);
break;
case ENET_EVENT_TYPE_DISCONNECT:
printf ("%s disconnected.\n", (char *)event.peer->data);
CServer = true;
Terminate = true;
event.peer->data = nullptr;
break;
case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT:
printf ("%s timeout.\n", (char *)event.peer->data);
CServer = true;
Terminate = true;
TCPSEND("TTimeout");
event.peer->data = nullptr;
break;
case ENET_EVENT_TYPE_NONE: break;
}
}
void RUDPClientThread(const std::string& IP, int Port){
std::condition_variable lock;
if (enet_initialize() != 0) {
std::cout << "An error occurred while initializing!\n";
}
Client client;
ENetAddress address = {0};
address.host = ENET_HOST_ANY;
address.port = Port;
if(MPDEV)std::cout << "(Launcher->Server) Connecting...\n";
enet_address_set_host(&address, IP.c_str());
client.host = enet_host_create(nullptr, 1, 2, 0, 0);
client.peer = enet_host_connect(client.host, &address, 2, 0);
if (client.peer == nullptr) {
if(MPDEV)std::cout << "could not connect\n";
TCPSEND("TTimeout");
TCPTerminate = true;
Terminate = true;
}
std::thread Ping(AutoPing,client.peer);
Ping.detach(); Ping.detach();
ENetEvent event; UDPClientMain(IP,Port);
while (!Terminate) {
ServerPeer = client.peer;
enet_host_service(client.host, &event, 1);
HandleEvent(event,client);
}
enet_peer_disconnect(client.peer,0);
enet_host_service(client.host, &event, 1);
HandleEvent(event,client);
CServer = true; CServer = true;
Terminate = true;
std::cout << "Connection Terminated!" << std::endl; std::cout << "Connection Terminated!" << std::endl;
} }
extern SOCKET UDPSock;
extern SOCKET TCPSock;
void Reset() {
ClientSocket = nullptr;
TCPTerminate = false;
Terminate = false;
UlStatus = "Ulstart";
MStatus = " ";
UDPSock = -1;
TCPSock = -1;
}
std::string Compress(const std::string&Data); std::string Compress(const std::string&Data);
std::string Decompress(const std::string&Data); std::string Decompress(const std::string&Data);
void TCPServerThread(const std::string& IP, int Port){ void TCPGameServer(const std::string& IP, int Port){
if(MPDEV)std::cout << "Proxy Started! " << IP << ":" << Port << std::endl; if(MPDEV)std::cout << "Game server Started! " << IP << ":" << Port << std::endl;
do { do {
if(MPDEV)std::cout << "Proxy on Start" << std::endl; Reset();
if(CServer) {
std::thread Client(TCPClientMain, IP, Port);
Client.detach();
}
if(MPDEV)std::cout << "Game server on Start" << std::endl;
WSADATA wsaData; WSADATA wsaData;
int iResult; int iResult;
SOCKET ListenSocket = INVALID_SOCKET; SOCKET ListenSocket = INVALID_SOCKET;
@@ -228,10 +196,11 @@ void TCPServerThread(const std::string& IP, int Port){
closesocket(ListenSocket); closesocket(ListenSocket);
if(MPDEV)std::cout << "(Proxy) Game Connected!" << std::endl; if(MPDEV)std::cout << "(Proxy) Game Connected!" << std::endl;
if(CServer){ if(CServer){
std::thread t1(RUDPClientThread, IP, Port); std::thread t1(NetMain, IP, Port);
t1.detach(); t1.detach();
CServer = false; CServer = false;
} }
ClientSocket = &Socket; ClientSocket = &Socket;
do { do {
//std::cout << "(Proxy) Waiting for Game Data..." << std::endl; //std::cout << "(Proxy) Waiting for Game Data..." << std::endl;
@@ -241,23 +210,14 @@ void TCPServerThread(const std::string& IP, int Port){
buff.resize(iResult*2); buff.resize(iResult*2);
memcpy(&buff[0],recvbuf,iResult); memcpy(&buff[0],recvbuf,iResult);
buff.resize(iResult); buff.resize(iResult);
/*if(MPDEV && buff.length() > 1000) {
std::string cmp = Compress(buff), dcm = Decompress(cmp); ServerSend(buff,false);
std::cout << "Compressed Size : " << cmp.length() << std::endl;
std::cout << "Decompressed Size : " << dcm.length() << std::endl;
if (cmp == dcm) {
std::cout << "Success!" << std::endl;
} else {
std::cout << "Fail!" << std::endl;
}
}*/
RUDPSEND(buff,false);
//std::cout << "(Game->Launcher) Data : " << buff.length() << std::endl;
} else if (iResult == 0) { } else if (iResult == 0) {
if(MPDEV)std::cout << "(Proxy) Connection closing...\n"; if(MPDEV)std::cout << "(Proxy) Connection closing...\n";
closesocket(Socket); closesocket(Socket);
WSACleanup(); WSACleanup();
Terminate = true;
continue; continue;
} else { } else {
if(MPDEV)std::cout << "(Proxy) recv failed with error: " << WSAGetLastError() << std::endl; if(MPDEV)std::cout << "(Proxy) recv failed with error: " << WSAGetLastError() << std::endl;
@@ -282,22 +242,15 @@ void TCPServerThread(const std::string& IP, int Port){
} }
void VehicleNetworkStart(); void VehicleNetworkStart();
void CoreNetworkThread();
void ProxyStart(){ void ProxyStart(){
std::thread t1(CoreNetworkThread); std::thread t1(CoreNetworkThread);
if(MPDEV)std::cout << "Core Network Started!\n"; if(MPDEV)std::cout << "Core Network Started!\n";
t1.join(); t1.join();
} }
void Reset() {
ClientSocket = nullptr;
ServerPeer = nullptr;
TCPTerminate = false;
Terminate = false;
}
void ProxyThread(const std::string& IP, int Port){ void ProxyThread(const std::string& IP, int Port){
Reset(); auto*t1 = new std::thread(TCPGameServer,IP,Port);
auto*t1 = new std::thread(TCPServerThread,IP,Port);
t1->detach(); t1->detach();
/*std::thread t2(VehicleNetworkStart); /*std::thread t2(VehicleNetworkStart);
t2.detach();*/ t2.detach();*/
+62
View File
@@ -0,0 +1,62 @@
///
/// Created by Anonymous275 on 5/8/2020
///
#include <WS2tcpip.h>
#include <iostream>
#include <thread>
extern bool Terminate;
extern int ClientID;
SOCKET UDPSock;
sockaddr_in ToServer{};
void UDPSend(const std::string&Data){
if(ClientID == -1 || UDPSock == INVALID_SOCKET)return;
std::string Packet = char(ClientID+1) + std::string(":") + Data;
int sendOk = sendto(UDPSock, Packet.c_str(), int(Packet.length()) + 1, 0, (sockaddr*)&ToServer, sizeof(ToServer));
if (sendOk == SOCKET_ERROR)std::cout << "Error Code : " << WSAGetLastError() << std::endl;
}
void ServerParser(const std::string& Data);
void UDPRcv(){
char buf[4096];
int len = 4096;
sockaddr_in FromServer{};
int clientLength = sizeof(FromServer);
ZeroMemory(&FromServer, clientLength);
ZeroMemory(buf, len);
if(UDPSock == INVALID_SOCKET)return;
int bytesIn = recvfrom(UDPSock, buf, len, 0, (sockaddr*)&FromServer, &clientLength);
if (bytesIn == SOCKET_ERROR)
{
//std::cout << "Error receiving from Server " << WSAGetLastError() << std::endl;
return;
}
ServerParser(std::string(buf));
}
void TCPSend(const std::string&Data);
void UDPClientMain(const std::string& IP,int Port){
WSADATA data;
if (WSAStartup(514, &data)) //2.2
{
std::cout << "Can't start Winsock! " << std::endl;
return;
}
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);
TCPSend("P");
UDPSend("p");
while (!Terminate){
UDPRcv();
}
closesocket(UDPSock);
WSACleanup();
}
+96
View File
@@ -0,0 +1,96 @@
///
/// Created by Anonymous275 on 5/8/2020
///
#include <chrono>
#include <iostream>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")
extern bool Terminate;
extern bool MPDEV;
SOCKET TCPSock;
void TCPSend(const std::string&Data){
if(TCPSock == INVALID_SOCKET){
Terminate = true;
return;
}
int BytesSent = send(TCPSock, Data.c_str(), int(Data.length())+1, 0);
if (BytesSent == 0){
if(MPDEV)std::cout << "(TCP) Connection closing..." << std::endl;
Terminate = true;
return;
}
else if (BytesSent < 0) {
if(MPDEV)std::cout << "(TCP) send failed with error: " << WSAGetLastError() << std::endl;
closesocket(TCPSock);
Terminate = true;
return;
}
}
void ServerParser(const std::string& Data);
void TCPRcv(){
char buf[10240];
int len = 10240;
ZeroMemory(buf, len);
if(TCPSock == INVALID_SOCKET){
Terminate = true;
return;
}
int BytesRcv = recv(TCPSock, buf, len,0);
if (BytesRcv == 0){
if(MPDEV)std::cout << "(TCP) Connection closing..." << std::endl;
Terminate = true;
return;
}
else if (BytesRcv < 0) {
if(MPDEV)std::cout << "(TCP) recv failed with error: " << WSAGetLastError() << std::endl;
closesocket(TCPSock);
Terminate = true;
return;
}
ServerParser(std::string(buf));
}
void TCPClientMain(const std::string& IP,int Port){
WSADATA wsaData;
SOCKADDR_IN ServerAddr;
int RetCode;
WSAStartup(514, &wsaData); //2.2
TCPSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(TCPSock == -1)
{
printf("Client: socket failed! Error code: %d\n", WSAGetLastError());
WSACleanup();
return;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr);
RetCode = connect(TCPSock, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
if(RetCode != 0)
{
std::cout << "Client: connect failed! Error code: " << WSAGetLastError() << std::endl;
closesocket(TCPSock);
WSACleanup();
return;
}
getsockname(TCPSock, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
while(!Terminate){
TCPRcv();
}
if( shutdown(TCPSock, SD_SEND) != 0 && MPDEV)
std::cout << "(TCP) shutdown error code: " << WSAGetLastError() << std::endl;
if(closesocket(TCPSock) != 0 && MPDEV)
std::cout << "(TCP) Cannot close socket. Error code: " << WSAGetLastError() << std::endl;
if(WSACleanup() != 0 && MPDEV)
std::cout << "(TCP) Client: WSACleanup() failed!..." << std::endl;
}
+161
View File
@@ -0,0 +1,161 @@
///
/// Created by Anonymous275 on 4/11/2020
///
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <WS2tcpip.h>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <filesystem>
namespace fs = std::experimental::filesystem;
void Exit(const std::string& Msg);
extern bool MPDEV;
std::vector<std::string> Split(const std::string& String,const std::string& delimiter){
std::vector<std::string> Val;
size_t pos = 0;
std::string token,s = String;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
Val.push_back(token);
s.erase(0, pos + delimiter.length());
}
Val.push_back(s);
return Val;
}
std::string STCPRecv(SOCKET socket){
char buf[65535];
int len = 65535;
ZeroMemory(buf, len);
int BytesRcv = recv(socket, buf, len,0);
if (BytesRcv == 0){
std::cout << "(TCP) Connection closing..." << std::endl;
return "";
}
else if (BytesRcv < 0) {
std::cout << "(TCP) recv failed with error: " << WSAGetLastError() << std::endl;
closesocket(socket);
return "";
}
return std::string(buf);
}
void ProxyThread(const std::string& IP, int port);
void SyncResources(const std::string&IP,int Port){
if(MPDEV)std::cout << "Called" << std::endl;
std::string FileList;
struct stat info{};
if(stat( "Resources", &info) != 0){
_wmkdir(L"Resources");
}
/*WSADATA wsaData;
SOCKET SendingSocket;
SOCKADDR_IN ServerAddr;
int RetCode;
int BytesSent, nlen;
WSAStartup(514, &wsaData); //2.2
SendingSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(SendingSocket == -1)
{
if(MPDEV)printf("Client: socket() failed! Error code: %d\n", WSAGetLastError());
WSACleanup();
return;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr);
RetCode = connect(SendingSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
if(RetCode != 0)
{
if(MPDEV)std::cout <<"Client: connect() failed! Error code: " << WSAGetLastError() << std::endl;
closesocket(SendingSocket);
WSACleanup();
return;
}
getsockname(SendingSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
BytesSent = send(SendingSocket, "a", 1, 0);
std::string File, Response, toSend, Data = STCPRecv(SendingSocket);
std::cout << Data << std::endl;
if (!Data.empty()) {
std::vector<std::string> list = Split(Data, ";");
std::vector<std::string> FileNames(list.begin(), list.begin() + (list.size() / 2));
std::vector<std::string> FileSizes(list.begin() + (list.size() / 2), list.end());
list.clear();
int index = 0;
for (const std::string &a : FileNames) {
if (a.empty() || a.length() < 2)continue;
if (stat(a.c_str(), &info) == 0) {
if (fs::file_size(a) == std::stoi(FileSizes.at(index))) {
index++;
continue;
} else remove(a.c_str());
}
std::ofstream LFS;
LFS.open(a.c_str());
LFS.close();
toSend = "b" + a;
send(SendingSocket, toSend.c_str(), toSend.length(), 0);
LFS.open(a.c_str(), std::ios_base::app | std::ios::binary);
do {
Data = STCPRecv(SendingSocket);
if (Data.empty()) {
File.clear();
break;
}
if (Data.find("Cannot Open") != std::string::npos) {
File.clear();
break;
}
LFS << Data;
float per = LFS.tellp() / std::stof(FileSizes.at(index)) * 100;
std::string Percent = std::to_string(truncf(per * 10) / 10);
UlStatus = "UlDownloading Resource: " + a.substr(a.find_last_of('/')) + " (" +
Percent.substr(0, Percent.find('.') + 2) + "%)";
} while (LFS.tellp() != std::stoi(FileSizes.at(index)));
LFS.close();
File.clear();
}
toSend = "M";
send(SendingSocket, toSend.c_str(), toSend.length(), 0);
Data = STCPRecv(SendingSocket);
MStatus = "M" + Data;
}
UlStatus = "Uldone";
std::cout << "Done!" << std::endl;
if(BytesSent == SOCKET_ERROR)
if(MPDEV)printf("Client: send() error %d.\n", WSAGetLastError());
if( shutdown(SendingSocket, SD_SEND) != 0)
if(MPDEV)printf("Client: Well, there is something wrong with the shutdown() The error code: %d\n", WSAGetLastError());
if(closesocket(SendingSocket) != 0)
if(MPDEV)printf("Client: Cannot close \"SendingSocket\" socket. Error code: %d\n", WSAGetLastError());
if(WSACleanup() != 0)
if(MPDEV)printf("Client: WSACleanup() failed!...\n");
*/
ProxyThread(IP,Port);
}
View File
File renamed without changes.
File renamed without changes.
@@ -13,7 +13,7 @@ extern bool TCPTerminate;
extern bool MPDEV; extern bool MPDEV;
void Print(const std::string&MSG); void Print(const std::string&MSG);
std::queue<std::string> VNTCPQueue; std::queue<std::string> VNTCPQueue;
void RUDPSEND(const std::string&Data,bool Rel); //void RUDPSEND(const std::string&Data,bool Rel);
#define DEFAULT_PORT "4446" #define DEFAULT_PORT "4446"
void Responder(const SOCKET *CS){ void Responder(const SOCKET *CS){
@@ -135,7 +135,7 @@ void VehicleNetworkStart(){
std::cout << "Fail!" << std::endl; std::cout << "Fail!" << std::endl;
} }
} }
RUDPSEND(buff,false); //RUDPSEND(buff,false);
//std::cout << "(Game->Launcher VN) Data : " << buff.length() << std::endl; //std::cout << "(Game->Launcher VN) Data : " << buff.length() << std::endl;
} else if (iResult == 0) { } else if (iResult == 0) {
if(MPDEV)std::cout << "(VN) Connection closing...\n"; if(MPDEV)std::cout << "(VN) Connection closing...\n";
+2 -2
View File
@@ -60,8 +60,8 @@
defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H))
/* The check above prevents the winsock2 inclusion if winsock.h already was /* The check above prevents the winsock2 inclusion if winsock.h already was
included, since they can't co-exist without problems */ included, since they can't co-exist without problems */
#include <winsock2.h> #include <WinSock2.h>
#include <ws2tcpip.h> #include <WS2tcpip.h>
#endif #endif
#endif #endif
File renamed without changes.
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
File renamed without changes.
+5906
View File
File diff suppressed because it is too large. Load diff
File renamed without changes.
File renamed without changes.
+7 -9
View File
@@ -87,7 +87,7 @@ int main(int argc, char* argv[]){
const unsigned long long NPos = std::string::npos; const unsigned long long NPos = std::string::npos;
struct stat info{}; struct stat info{};
std::string ver = "0.921", link, Path = CheckDir(argv[0],ver),HTTP_Result; std::string ver = "1.0", link, Path = CheckDir(argv[0],ver),HTTP_Result;
std::thread CFU(CheckForUpdates,ver); std::thread CFU(CheckForUpdates,ver);
CFU.join(); CFU.join();
if(argc > 1){ if(argc > 1){
@@ -115,7 +115,7 @@ int main(int argc, char* argv[]){
exit(-1); exit(-1);
} }
} }
}else MPDEV = true; }else MPDEV = false;
//Security //Security
auto*Sec = new std::thread(Check); auto*Sec = new std::thread(Check);
Sec->join(); Sec->join();
@@ -133,14 +133,12 @@ int main(int argc, char* argv[]){
Download(link,Settings); Download(link,Settings);
std::cout << "Download Complete!" << std::endl; std::cout << "Download Complete!" << std::endl;
} }
std::cout << "Downloading mod..." << std::endl;
link = "https://beamng-mp.com/builds/client?did="+GlobalInfo.at(2);
Download(link,Path + R"(\mods\BeamMP.zip)");
std::cout << "Download Complete!" << std::endl;
link.clear();
std::thread Game(StartGame,ExeDir,(Path + "\\"));
Game.detach();
if(!MPDEV){ if(!MPDEV){
std::cout << "Downloading mod..." << std::endl;
link = "https://beamng-mp.com/builds/client?did="+GlobalInfo.at(2);
Download(link,Path + R"(\mods\BeamMP.zip)");
std::cout << "Download Complete!" << std::endl;
link.clear();
std::thread Game(StartGame,ExeDir,(Path + "\\")); std::thread Game(StartGame,ExeDir,(Path + "\\"));
Game.detach(); Game.detach();
}else{ }else{