mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2025-08-17 16:57:11 +00:00
[Fixed] Check port if valid
This commit is contained in:
parent
b756b00503
commit
93727ac48a
@ -4,6 +4,7 @@
|
|||||||
///
|
///
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#include "Compressor.h"
|
#include "Compressor.h"
|
||||||
#include "Server.h"
|
#include "Server.h"
|
||||||
#include "Launcher.h"
|
#include "Launcher.h"
|
||||||
@ -12,7 +13,7 @@
|
|||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
Server::Server(Launcher* Instance) : LauncherInstance(Instance) {
|
Server::Server(Launcher *Instance) : LauncherInstance(Instance) {
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
int iRes = WSAStartup(514, &wsaData); //2.2
|
int iRes = WSAStartup(514, &wsaData); //2.2
|
||||||
if (iRes != 0) {
|
if (iRes != 0) {
|
||||||
@ -29,7 +30,7 @@ Server::~Server() {
|
|||||||
void Server::TCPClientMain() {
|
void Server::TCPClientMain() {
|
||||||
SOCKADDR_IN ServerAddr;
|
SOCKADDR_IN ServerAddr;
|
||||||
TCPSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
TCPSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||||
if(TCPSocket == -1) {
|
if (TCPSocket == -1) {
|
||||||
LOG(ERROR) << "Socket failed! Error code: " << GetSocketApiError();
|
LOG(ERROR) << "Socket failed! Error code: " << GetSocketApiError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -42,17 +43,21 @@ void Server::TCPClientMain() {
|
|||||||
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);
|
||||||
status = connect(TCPSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
|
status = connect(TCPSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
|
||||||
if(status != 0){
|
if (status != 0) {
|
||||||
UStatus = "Connection Failed!";
|
UStatus = "Connection Failed!";
|
||||||
LOG(ERROR) << "Connect failed! Error code: " << GetSocketApiError();
|
LOG(ERROR) << "Connect failed! Error code: " << GetSocketApiError();
|
||||||
Close();
|
Terminate.store(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char Code = 'C';
|
||||||
|
if (send(TCPSocket, &Code, 1, 0) != 1) {
|
||||||
|
Terminate.store(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LOG(INFO) << "Connected!";
|
LOG(INFO) << "Connected!";
|
||||||
char Code = 'C';
|
|
||||||
send(TCPSocket, &Code, 1, 0);
|
|
||||||
SyncResources();
|
SyncResources();
|
||||||
while(!Terminate.load()) {
|
while (!Terminate.load()) {
|
||||||
ServerParser(TCPRcv());
|
ServerParser(TCPRcv());
|
||||||
}
|
}
|
||||||
LauncherInstance->SendIPC("T", false);
|
LauncherInstance->SendIPC("T", false);
|
||||||
@ -60,25 +65,26 @@ void Server::TCPClientMain() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Server::StartUDP() {
|
void Server::StartUDP() {
|
||||||
if(TCPConnection.joinable() && !UDPConnection.joinable()) {
|
if (TCPConnection.joinable() && !UDPConnection.joinable()) {
|
||||||
LOG(INFO) << "Connecting UDP";
|
LOG(INFO) << "Connecting UDP";
|
||||||
UDPConnection = std::thread(&Server::UDPMain, this);
|
UDPConnection = std::thread(&Server::UDPMain, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::UDPSend(std::string Data) {
|
void Server::UDPSend(std::string Data) {
|
||||||
if(ClientID == -1 || UDPSocket == -1)return;
|
if (ClientID == -1 || UDPSocket == -1)return;
|
||||||
if(Data.length() > 400){
|
if (Data.length() > 400) {
|
||||||
std::string CMP(Zlib::Comp(Data));
|
std::string CMP(Zlib::Comp(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(UDPSocket, Packet.c_str(), int(Packet.size()), 0, (sockaddr*)UDPSockAddress.get(), sizeof(sockaddr_in));
|
int sendOk = sendto(UDPSocket, Packet.c_str(), int(Packet.size()), 0, (sockaddr *) UDPSockAddress.get(),
|
||||||
|
sizeof(sockaddr_in));
|
||||||
if (sendOk == SOCKET_ERROR)LOG(ERROR) << "UDP Socket Error Code : " << GetSocketApiError();
|
if (sendOk == SOCKET_ERROR)LOG(ERROR) << "UDP Socket Error Code : " << GetSocketApiError();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::UDPParser(std::string Packet) {
|
void Server::UDPParser(std::string Packet) {
|
||||||
if(Packet.substr(0,4) == "ABG:"){
|
if (Packet.substr(0, 4) == "ABG:") {
|
||||||
Packet = Zlib::DeComp(Packet.substr(4));
|
Packet = Zlib::DeComp(Packet.substr(4));
|
||||||
}
|
}
|
||||||
ServerParser(Packet);
|
ServerParser(Packet);
|
||||||
@ -88,11 +94,11 @@ void Server::UDPRcv() {
|
|||||||
sockaddr_in FromServer{};
|
sockaddr_in FromServer{};
|
||||||
int clientLength = sizeof(FromServer);
|
int clientLength = sizeof(FromServer);
|
||||||
ZeroMemory(&FromServer, clientLength);
|
ZeroMemory(&FromServer, clientLength);
|
||||||
std::string Ret(10240,0);
|
std::string Ret(10240, 0);
|
||||||
if(UDPSocket == -1)return;
|
if (UDPSocket == -1)return;
|
||||||
int32_t Rcv = recvfrom(UDPSocket, &Ret[0], 10240, 0, (sockaddr*)&FromServer, &clientLength);
|
int32_t Rcv = recvfrom(UDPSocket, &Ret[0], 10240, 0, (sockaddr *) &FromServer, &clientLength);
|
||||||
if (Rcv == SOCKET_ERROR)return;
|
if (Rcv == SOCKET_ERROR)return;
|
||||||
UDPParser(Ret.substr(0,Rcv));
|
UDPParser(Ret.substr(0, Rcv));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::UDPClient() {
|
void Server::UDPClient() {
|
||||||
@ -100,10 +106,10 @@ void Server::UDPClient() {
|
|||||||
UDPSockAddress->sin_port = htons(Port);
|
UDPSockAddress->sin_port = htons(Port);
|
||||||
inet_pton(AF_INET, IP.c_str(), &UDPSockAddress->sin_addr);
|
inet_pton(AF_INET, IP.c_str(), &UDPSockAddress->sin_addr);
|
||||||
UDPSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
UDPSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
LauncherInstance->SendIPC("P"+std::to_string(ClientID), false);
|
LauncherInstance->SendIPC("P" + std::to_string(ClientID), false);
|
||||||
TCPSend("H");
|
TCPSend("H");
|
||||||
UDPSend("p");
|
UDPSend("p");
|
||||||
while(!Terminate)UDPRcv();
|
while (!Terminate)UDPRcv();
|
||||||
KillSocket(UDPSocket);
|
KillSocket(UDPSocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,18 +120,21 @@ void Server::UDPMain() {
|
|||||||
LOG(INFO) << "Connection terminated";
|
LOG(INFO) << "Connection terminated";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::Connect(const std::string& Data) {
|
void Server::Connect(const std::string &Data) {
|
||||||
ModList.clear();
|
ModList.clear();
|
||||||
Terminate.store(false);
|
Terminate.store(false);
|
||||||
IP = GetAddress(Data.substr(1,Data.find(':')-1));
|
IP = GetAddress(Data.substr(1, Data.find(':') - 1));
|
||||||
if(IP.find('.') == -1){
|
std::string port = Data.substr(Data.find(':') + 1);
|
||||||
if(IP == "DNS")UStatus ="Connection Failed! (DNS Lookup Failed)";
|
bool ValidPort = std::all_of(port.begin(), port.end(), ::isdigit);
|
||||||
|
if (IP.find('.') == -1 || !ValidPort) {
|
||||||
|
if (IP == "DNS") UStatus = "Connection Failed! (DNS Lookup Failed)";
|
||||||
|
else if (!ValidPort) UStatus = "Connection Failed! (Invalid Port)";
|
||||||
else UStatus = "Connection Failed! (WSA failed to start)";
|
else UStatus = "Connection Failed! (WSA failed to start)";
|
||||||
ModList = "-";
|
ModList = "-";
|
||||||
Terminate.store(true);
|
Terminate.store(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Port = std::stoi(Data.substr(Data.find(':')+1));
|
Port = std::stoi(port);
|
||||||
LauncherInstance->CheckKey();
|
LauncherInstance->CheckKey();
|
||||||
UStatus = "Loading...";
|
UStatus = "Loading...";
|
||||||
Ping = -1;
|
Ping = -1;
|
||||||
@ -134,7 +143,7 @@ void Server::Connect(const std::string& Data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Server::SendLarge(std::string Data) {
|
void Server::SendLarge(std::string Data) {
|
||||||
if(Data.length() > 400) {
|
if (Data.length() > 400) {
|
||||||
std::string CMP(Zlib::Comp(Data));
|
std::string CMP(Zlib::Comp(Data));
|
||||||
Data = "ABG:" + CMP;
|
Data = "ABG:" + CMP;
|
||||||
}
|
}
|
||||||
@ -151,12 +160,12 @@ std::string Server::GetSocketApiError() {
|
|||||||
err = WSAGetLastError();
|
err = WSAGetLastError();
|
||||||
|
|
||||||
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
nullptr,
|
nullptr,
|
||||||
err,
|
err,
|
||||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
msgbuf,
|
msgbuf,
|
||||||
sizeof(msgbuf),
|
sizeof(msgbuf),
|
||||||
nullptr);
|
nullptr);
|
||||||
|
|
||||||
if (*msgbuf) {
|
if (*msgbuf) {
|
||||||
return std::to_string(WSAGetLastError()) + " - " + std::string(msgbuf);
|
return std::to_string(WSAGetLastError()) + " - " + std::string(msgbuf);
|
||||||
@ -166,23 +175,23 @@ std::string Server::GetSocketApiError() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Server::ServerSend(std::string Data, bool Rel) {
|
void Server::ServerSend(std::string Data, bool Rel) {
|
||||||
if(Terminate || Data.empty())return;
|
if (Terminate || Data.empty())return;
|
||||||
char C = 0;
|
char C = 0;
|
||||||
int DLen = int(Data.length());
|
int DLen = int(Data.length());
|
||||||
if(DLen > 3)C = Data.at(0);
|
if (DLen > 3)C = Data.at(0);
|
||||||
bool Ack = C == 'O' || C == 'T';
|
bool Ack = C == 'O' || C == 'T';
|
||||||
if(C == 'N' || C == 'W' || C == 'Y' || C == 'V' || C == 'E' || C == 'C')Rel = true;
|
if (C == 'N' || C == 'W' || C == 'Y' || C == 'V' || C == 'E' || C == 'C')Rel = true;
|
||||||
if(Ack || Rel) {
|
if (Ack || Rel) {
|
||||||
if(Ack || DLen > 1000)SendLarge(Data);
|
if (Ack || DLen > 1000)SendLarge(Data);
|
||||||
else TCPSend(Data);
|
else TCPSend(Data);
|
||||||
}else UDPSend(Data);
|
} else UDPSend(Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::PingLoop() {
|
void Server::PingLoop() {
|
||||||
while(!Terminate){
|
while (!Terminate) {
|
||||||
ServerSend("p", false);
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,13 +200,13 @@ void Server::Close() {
|
|||||||
KillSocket(TCPSocket);
|
KillSocket(TCPSocket);
|
||||||
KillSocket(UDPSocket);
|
KillSocket(UDPSocket);
|
||||||
Ping = -1;
|
Ping = -1;
|
||||||
if(TCPConnection.joinable()) {
|
if (TCPConnection.joinable()) {
|
||||||
TCPConnection.join();
|
TCPConnection.join();
|
||||||
}
|
}
|
||||||
if(UDPConnection.joinable()) {
|
if (UDPConnection.joinable()) {
|
||||||
UDPConnection.join();
|
UDPConnection.join();
|
||||||
}
|
}
|
||||||
if(AutoPing.joinable()) {
|
if (AutoPing.joinable()) {
|
||||||
AutoPing.join();
|
AutoPing.join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -218,24 +227,24 @@ int Server::getPing() const {
|
|||||||
return Ping;
|
return Ping;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Server::getUIStatus() {
|
const std::string &Server::getUIStatus() {
|
||||||
return UStatus;
|
return UStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Server::GetAddress(const std::string& Data) {
|
std::string Server::GetAddress(const std::string &Data) {
|
||||||
if(Data.find_first_not_of("0123456789.") == -1)return Data;
|
if (Data.find_first_not_of("0123456789.") == -1)return Data;
|
||||||
hostent* host;
|
hostent *host;
|
||||||
host = gethostbyname(Data.c_str());
|
host = gethostbyname(Data.c_str());
|
||||||
if(!host){
|
if (!host) {
|
||||||
LOG(ERROR) << "DNS lookup failed! on " << Data;
|
LOG(ERROR) << "DNS lookup failed! on " << Data;
|
||||||
return "DNS";
|
return "DNS";
|
||||||
}
|
}
|
||||||
std::string Ret = inet_ntoa(*((struct in_addr *)host->h_addr));
|
std::string Ret = inet_ntoa(*((struct in_addr *) host->h_addr));
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Server::KillSocket(uint64_t Dead) {
|
int Server::KillSocket(uint64_t Dead) {
|
||||||
if(Dead == (SOCKET)-1)return 0;
|
if (Dead == (SOCKET) -1)return 0;
|
||||||
shutdown(Dead, SD_BOTH);
|
shutdown(Dead, SD_BOTH);
|
||||||
return closesocket(Dead);
|
return closesocket(Dead);
|
||||||
}
|
}
|
||||||
@ -244,16 +253,16 @@ void Server::setModLoaded() {
|
|||||||
ModLoaded.store(true);
|
ModLoaded.store(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::UUl(const std::string& R) {
|
void Server::UUl(const std::string &R) {
|
||||||
UStatus = "Disconnected: " + R;
|
UStatus = "Disconnected: " + R;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Server::CheckBytes(int32_t Bytes) {
|
bool Server::CheckBytes(int32_t Bytes) {
|
||||||
if (Bytes == 0){
|
if (Bytes == 0) {
|
||||||
//debug("(TCP) Connection closing... CheckBytes(16)");
|
//debug("(TCP) Connection closing... CheckBytes(16)");
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return false;
|
return false;
|
||||||
}else if (Bytes < 0) {
|
} else if (Bytes < 0) {
|
||||||
//debug("(TCP CB) recv failed with error: " + GetSocketApiError();
|
//debug("(TCP CB) recv failed with error: " + GetSocketApiError();
|
||||||
KillSocket(TCPSocket);
|
KillSocket(TCPSocket);
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
@ -262,23 +271,23 @@ bool Server::CheckBytes(int32_t Bytes) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::TCPSend(const std::string& Data) {
|
void Server::TCPSend(const std::string &Data) {
|
||||||
|
|
||||||
if(TCPSocket == -1) {
|
if (TCPSocket == -1) {
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
UUl("Invalid Socket");
|
UUl("Invalid Socket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Size,Sent,Temp;
|
int32_t Size, Sent, Temp;
|
||||||
std::string Send(4,0);
|
std::string Send(4, 0);
|
||||||
Size = int32_t(Data.size());
|
Size = int32_t(Data.size());
|
||||||
memcpy(&Send[0],&Size,sizeof(Size));
|
memcpy(&Send[0], &Size, sizeof(Size));
|
||||||
Send += Data;
|
Send += Data;
|
||||||
// Do not use Size before this point for anything but the header
|
// Do not use Size before this point for anything but the header
|
||||||
Sent = 0;
|
Sent = 0;
|
||||||
Size += 4;
|
Size += 4;
|
||||||
do{
|
do {
|
||||||
if (size_t(Sent) >= Send.size()) {
|
if (size_t(Sent) >= Send.size()) {
|
||||||
LOG(ERROR) << "string OOB in " << std::string(__func__);
|
LOG(ERROR) << "string OOB in " << std::string(__func__);
|
||||||
UUl("TCP Send OOB");
|
UUl("TCP Send OOB");
|
||||||
@ -286,57 +295,57 @@ void Server::TCPSend(const std::string& Data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Temp = send(TCPSocket, &Send[Sent], Size - Sent, 0);
|
Temp = send(TCPSocket, &Send[Sent], Size - Sent, 0);
|
||||||
if(!CheckBytes(Temp)){
|
if (!CheckBytes(Temp)) {
|
||||||
UUl("Socket Closed Code 2");
|
UUl("Socket Closed Code 2");
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Sent += Temp;
|
Sent += Temp;
|
||||||
}while(Sent < Size);
|
} while (Sent < Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Server::TCPRcv() {
|
std::string Server::TCPRcv() {
|
||||||
if(TCPSocket == -1){
|
if (TCPSocket == -1) {
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
UUl("Invalid Socket");
|
UUl("Invalid Socket");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
int32_t Header,BytesRcv = 0,Temp;
|
int32_t Header, BytesRcv = 0, Temp;
|
||||||
std::vector<char> Data(sizeof(Header));
|
std::vector<char> Data(sizeof(Header));
|
||||||
do{
|
do {
|
||||||
Temp = recv(TCPSocket, &Data[BytesRcv], 4-BytesRcv, 0);
|
Temp = recv(TCPSocket, &Data[BytesRcv], 4 - BytesRcv, 0);
|
||||||
if(!CheckBytes(Temp)){
|
if (!CheckBytes(Temp)) {
|
||||||
UUl("Socket Closed Code 3");
|
UUl("Socket Closed Code 3");
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
BytesRcv += Temp;
|
BytesRcv += Temp;
|
||||||
}while(BytesRcv < 4);
|
} while (BytesRcv < 4);
|
||||||
memcpy(&Header,&Data[0],sizeof(Header));
|
memcpy(&Header, &Data[0], sizeof(Header));
|
||||||
|
|
||||||
if(!CheckBytes(BytesRcv)){
|
if (!CheckBytes(BytesRcv)) {
|
||||||
UUl("Socket Closed Code 4");
|
UUl("Socket Closed Code 4");
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
Data.resize(Header);
|
Data.resize(Header);
|
||||||
BytesRcv = 0;
|
BytesRcv = 0;
|
||||||
do{
|
do {
|
||||||
Temp = recv(TCPSocket, &Data[BytesRcv], Header-BytesRcv, 0);
|
Temp = recv(TCPSocket, &Data[BytesRcv], Header - BytesRcv, 0);
|
||||||
if(!CheckBytes(Temp)){
|
if (!CheckBytes(Temp)) {
|
||||||
UUl("Socket Closed Code 5");
|
UUl("Socket Closed Code 5");
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
BytesRcv += Temp;
|
BytesRcv += Temp;
|
||||||
}while(BytesRcv < Header);
|
} while (BytesRcv < Header);
|
||||||
|
|
||||||
std::string Ret(Data.data(),Header);
|
std::string Ret(Data.data(), Header);
|
||||||
|
|
||||||
if (Ret.substr(0, 4) == "ABG:") {
|
if (Ret.substr(0, 4) == "ABG:") {
|
||||||
Ret = Zlib::DeComp(Ret.substr(4));
|
Ret = Zlib::DeComp(Ret.substr(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Ret[0] == 'E')UUl(Ret.substr(1));
|
if (Ret[0] == 'E')UUl(Ret.substr(1));
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user