mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2026-10-26 22:20:24 +00:00
launcher now waits for the game
This commit is contained in:
1 parent
042671b146
commit
07f7b69a88
5 files changed
+77
-23
No files matched your search
+2
-2
@@ -21,8 +21,8 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,16 +19,16 @@ extern std::vector<std::string> GlobalInfo;
|
|||||||
bool TCPTerminate = false;
|
bool TCPTerminate = false;
|
||||||
bool Terminate = false;
|
bool Terminate = false;
|
||||||
bool CServer = true;
|
bool CServer = true;
|
||||||
SOCKET*ClientSocket;
|
bool gameConected = false;
|
||||||
|
SOCKET ClientSocket;
|
||||||
extern bool MPDEV;
|
extern bool MPDEV;
|
||||||
int ping = 0;
|
int ping = 0;
|
||||||
|
|
||||||
void GameSend(const std::string&Data){
|
void GameSend(const std::string&Data){
|
||||||
if(!TCPTerminate) {
|
if(TCPTerminate || !gameConected || ClientSocket == -1)return;
|
||||||
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) {
|
||||||
if (MPDEV)std::cout << "(Proxy) send failed with error: " << WSAGetLastError() << std::endl;
|
if (MPDEV)std::cout << "(Proxy) send failed with error: " << WSAGetLastError() << std::endl;
|
||||||
TCPTerminate = true;
|
|
||||||
} else {
|
} else {
|
||||||
if (MPDEV && Data.length() > 1000) {
|
if (MPDEV && Data.length() > 1000) {
|
||||||
std::cout << "(Launcher->Game) Bytes sent: " << iSendResult << std::endl;
|
std::cout << "(Launcher->Game) Bytes sent: " << iSendResult << std::endl;
|
||||||
@@ -36,16 +36,19 @@ void GameSend(const std::string&Data){
|
|||||||
//std::cout << "(Launcher->Game) Bytes sent: " << iSendResult << " : " << Data << std::endl;
|
//std::cout << "(Launcher->Game) Bytes sent: " << iSendResult << " : " << Data << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
void TCPSendLarge(const std::string&Data);
|
||||||
void TCPSend(const std::string&Data);
|
void TCPSend(const std::string&Data);
|
||||||
void UDPSend(const std::string&Data);
|
void UDPSend(const std::string&Data);
|
||||||
void ServerSend(const std::string&Data, bool Rel){
|
void ServerSend(const std::string&Data, bool Rel){
|
||||||
if(!Terminate){
|
if(Terminate || Data.empty())return;
|
||||||
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;
|
||||||
|
|
||||||
if(Rel)TCPSend(Data);
|
if(Rel){
|
||||||
|
if(Data.length() > 1000)TCPSendLarge(Data);
|
||||||
|
else TCPSend(Data);
|
||||||
|
}
|
||||||
else UDPSend(Data);
|
else UDPSend(Data);
|
||||||
|
|
||||||
if (MPDEV && Data.length() > 1000) {
|
if (MPDEV && Data.length() > 1000) {
|
||||||
@@ -57,7 +60,6 @@ void ServerSend(const std::string&Data, bool Rel){
|
|||||||
//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);
|
||||||
ServerSend(Packet,true);
|
ServerSend(Packet,true);
|
||||||
@@ -74,6 +76,7 @@ void AutoPing(){
|
|||||||
std::string UlStatus = "Ulstart";
|
std::string UlStatus = "Ulstart";
|
||||||
std::string MStatus = " ";
|
std::string MStatus = " ";
|
||||||
void ServerParser(const std::string& Data){
|
void ServerParser(const std::string& Data){
|
||||||
|
if(Data.empty())return;
|
||||||
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) {
|
||||||
@@ -108,8 +111,8 @@ void NetMain(const std::string& IP, int Port){
|
|||||||
extern SOCKET UDPSock;
|
extern SOCKET UDPSock;
|
||||||
extern SOCKET TCPSock;
|
extern SOCKET TCPSock;
|
||||||
void Reset() {
|
void Reset() {
|
||||||
ClientSocket = nullptr;
|
|
||||||
TCPTerminate = false;
|
TCPTerminate = false;
|
||||||
|
gameConected = false;
|
||||||
Terminate = false;
|
Terminate = false;
|
||||||
UlStatus = "Ulstart";
|
UlStatus = "Ulstart";
|
||||||
MStatus = " ";
|
MStatus = " ";
|
||||||
@@ -195,13 +198,14 @@ void TCPGameServer(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;
|
||||||
|
gameConected = true;
|
||||||
if(CServer){
|
if(CServer){
|
||||||
std::thread t1(NetMain, 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;
|
||||||
iResult = recv(Socket, recvbuf, recvbuflen, 0);
|
iResult = recv(Socket, recvbuf, recvbuflen, 0);
|
||||||
@@ -250,8 +254,8 @@ void ProxyStart(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ProxyThread(const std::string& IP, int Port){
|
void ProxyThread(const std::string& IP, int Port){
|
||||||
auto*t1 = new std::thread(TCPGameServer,IP,Port);
|
std::thread GameThread(TCPGameServer,IP,Port);
|
||||||
t1->detach();
|
GameThread.detach();
|
||||||
/*std::thread t2(VehicleNetworkStart);
|
/*std::thread t2(VehicleNetworkStart);
|
||||||
t2.detach();*/
|
t2.detach();*/
|
||||||
}
|
}
|
||||||
@@ -6,12 +6,15 @@
|
|||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
extern bool Terminate;
|
extern bool Terminate;
|
||||||
extern int ClientID;
|
extern int ClientID;
|
||||||
SOCKET UDPSock;
|
SOCKET UDPSock;
|
||||||
sockaddr_in ToServer{};
|
sockaddr_in ToServer{};
|
||||||
|
|
||||||
|
std::set<std::pair<int,std::string>> BigDataAcks;
|
||||||
void UDPSend(const std::string&Data){
|
void UDPSend(const std::string&Data){
|
||||||
if(ClientID == -1 || UDPSock == INVALID_SOCKET)return;
|
if(ClientID == -1 || UDPSock == INVALID_SOCKET)return;
|
||||||
std::string Packet = char(ClientID+1) + std::string(":") + Data;
|
std::string Packet = char(ClientID+1) + std::string(":") + Data;
|
||||||
@@ -19,10 +22,49 @@ void UDPSend(const std::string&Data){
|
|||||||
if (sendOk == SOCKET_ERROR)std::cout << "Error Code : " << WSAGetLastError() << std::endl;
|
if (sendOk == SOCKET_ERROR)std::cout << "Error Code : " << WSAGetLastError() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LOOP(){
|
||||||
|
while(UDPSock != -1) {
|
||||||
|
for (const std::pair<int, std::string>& a : BigDataAcks) {
|
||||||
|
//UDPSend(a.second);
|
||||||
|
}
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AckID(int ID){
|
||||||
|
if(BigDataAcks.empty())return;
|
||||||
|
for(const std::pair<int,std::string>& a : BigDataAcks){
|
||||||
|
if(a.first == ID)BigDataAcks.erase(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSendLarge(const std::string&Data){
|
||||||
|
static int ID = 0;
|
||||||
|
std::string Header = "BD:" + std::to_string(ID) + ":";
|
||||||
|
//BigDataAcks.insert(std::make_pair(ID,Header+Data));
|
||||||
|
UDPSend(Header+Data);
|
||||||
|
if(ID > 483647)ID = 0;
|
||||||
|
else ID++;
|
||||||
|
}
|
||||||
|
|
||||||
void ServerParser(const std::string& Data);
|
void ServerParser(const std::string& Data);
|
||||||
|
void UDPParser(const std::string&Packet){
|
||||||
|
if(Packet.substr(0,4) == "ACK:"){
|
||||||
|
AckID(stoi(Packet.substr(4)));
|
||||||
|
return;
|
||||||
|
}else if(Packet.substr(0,3) == "BD:"){
|
||||||
|
int pos = Packet.find(':',4);
|
||||||
|
std::string pckt = "ACK:" + Packet.substr(3,pos-3);
|
||||||
|
UDPSend(pckt);
|
||||||
|
pckt = Packet.substr(pos+1);
|
||||||
|
ServerParser(pckt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ServerParser(Packet);
|
||||||
|
}
|
||||||
void UDPRcv(){
|
void UDPRcv(){
|
||||||
char buf[4096];
|
char buf[10240];
|
||||||
int len = 4096;
|
int len = 10240;
|
||||||
sockaddr_in FromServer{};
|
sockaddr_in FromServer{};
|
||||||
int clientLength = sizeof(FromServer);
|
int clientLength = sizeof(FromServer);
|
||||||
ZeroMemory(&FromServer, clientLength);
|
ZeroMemory(&FromServer, clientLength);
|
||||||
@@ -34,7 +76,7 @@ void UDPRcv(){
|
|||||||
//std::cout << "Error receiving from Server " << WSAGetLastError() << std::endl;
|
//std::cout << "Error receiving from Server " << WSAGetLastError() << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ServerParser(std::string(buf));
|
UDPParser(std::string(buf));
|
||||||
}
|
}
|
||||||
void TCPSend(const std::string&Data);
|
void TCPSend(const std::string&Data);
|
||||||
void UDPClientMain(const std::string& IP,int Port){
|
void UDPClientMain(const std::string& IP,int Port){
|
||||||
@@ -49,8 +91,9 @@ void UDPClientMain(const std::string& IP,int Port){
|
|||||||
ToServer.sin_port = htons(Port);
|
ToServer.sin_port = htons(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);
|
||||||
|
BigDataAcks.clear();
|
||||||
|
std::thread Ack(LOOP);
|
||||||
|
Ack.detach();
|
||||||
TCPSend("P");
|
TCPSend("P");
|
||||||
UDPSend("p");
|
UDPSend("p");
|
||||||
while (!Terminate){
|
while (!Terminate){
|
||||||
|
|||||||
@@ -6,10 +6,14 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
#pragma comment (lib, "ws2_32.lib")
|
#pragma comment (lib, "ws2_32.lib")
|
||||||
extern bool Terminate;
|
extern bool Terminate;
|
||||||
extern bool MPDEV;
|
extern bool MPDEV;
|
||||||
SOCKET TCPSock;
|
SOCKET TCPSock;
|
||||||
|
|
||||||
|
|
||||||
void TCPSend(const std::string&Data){
|
void TCPSend(const std::string&Data){
|
||||||
if(TCPSock == INVALID_SOCKET){
|
if(TCPSock == INVALID_SOCKET){
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
@@ -29,10 +33,11 @@ void TCPSend(const std::string&Data){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ServerParser(const std::string& Data);
|
void ServerParser(const std::string& Data);
|
||||||
void TCPRcv(){
|
void TCPRcv(){
|
||||||
char buf[10240];
|
char buf[4096];
|
||||||
int len = 10240;
|
int len = 4096;
|
||||||
ZeroMemory(buf, len);
|
ZeroMemory(buf, len);
|
||||||
if(TCPSock == INVALID_SOCKET){
|
if(TCPSock == INVALID_SOCKET){
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
@@ -67,9 +72,11 @@ void TCPClientMain(const std::string& IP,int Port){
|
|||||||
WSACleanup();
|
WSACleanup();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerAddr.sin_family = AF_INET;
|
ServerAddr.sin_family = AF_INET;
|
||||||
ServerAddr.sin_port = htons(Port);
|
ServerAddr.sin_port = htons(Port);
|
||||||
inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr);
|
inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr);
|
||||||
|
|
||||||
RetCode = connect(TCPSock, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
|
RetCode = connect(TCPSock, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
|
||||||
if(RetCode != 0)
|
if(RetCode != 0)
|
||||||
{
|
{
|
||||||
|
|||||||
+2
-2
@@ -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 = "1.0", link, Path = CheckDir(argv[0],ver),HTTP_Result;
|
std::string ver = "1.1", 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 = false;
|
}else MPDEV = true;
|
||||||
//Security
|
//Security
|
||||||
auto*Sec = new std::thread(Check);
|
auto*Sec = new std::thread(Check);
|
||||||
Sec->join();
|
Sec->join();
|
||||||
|
|||||||
Reference in new issue
Block a user