From 7149075d53e19ab179c6b76a889e55e6f778797e Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sun, 22 Dec 2024 23:56:29 +0100 Subject: [PATCH 1/6] Implement core server information packet --- src/Network/Core.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index adbe05e..2211a58 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -89,6 +89,61 @@ void StartSync(const std::string& Data) { info("Connecting to server"); } +void GetServerInfo(std::string Data) { + debug("Fetching server info of " + Data); + + std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); + if (IP.find('.') == -1) { + if (IP == "DNS") + warn("Connection Failed! (DNS Lookup Failed) for " + Data); + else + warn("Connection Failed! (WSA failed to start) for " + Data); + CoreSend("I" + Data + ";"); + return; + } + + SOCKET ISock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + SOCKADDR_IN ServerAddr; + if (ISock < 1) { + debug("Socket creation failed with error: " + std::to_string(WSAGetLastError())); + KillSocket(ISock); + CoreSend("I" + Data + ";"); + return; + } + ServerAddr.sin_family = AF_INET; + ServerAddr.sin_port = htons(std::stoi(Data.substr(Data.find(':') + 1))); + inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr); + if (connect(ISock, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) != 0) { + debug("Connection to server failed with error: " + std::to_string(WSAGetLastError())); + KillSocket(ISock); + CoreSend("I" + Data + ";"); + return; + } + char Code[1] = { 'I' }; + if (send(ISock, Code, 1, 0) != 1) { + debug("Sending data to server failed with error: " + std::to_string(WSAGetLastError())); + KillSocket(ISock); + CoreSend("I" + Data + ";"); + return; + } + + std::string buffer; + buffer.resize(1024); + int bytesReceived = recv(ISock, &buffer[0], buffer.size() - 1, 0); + + if (bytesReceived > 0) { + buffer.resize(bytesReceived); + debug("Server Info: " + buffer); + + CoreSend("I" + Data + ";" + buffer); + } else { + debug("Receiving data from server failed with error: " + std::to_string(WSAGetLastError())); + debug("Failed to receive server info from " + Data); + CoreSend("I" + Data + ";"); + } + + KillSocket(ISock); +} std::mutex sendMutex; void CoreSend(std::string data) { @@ -235,6 +290,12 @@ void Parse(std::string Data, SOCKET CSocket) { Data.clear(); break; + case 'I': { + auto future = std::async(std::launch::async, [data = std::move(Data)]() { + GetServerInfo(data); + }); + break; + } default: Data.clear(); break; From d14b64c652bb69c362d17df7826cd3feda6829cb Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Wed, 25 Dec 2024 00:07:13 +0100 Subject: [PATCH 2/6] Fix linux build --- include/Network/network.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Network/network.hpp b/include/Network/network.hpp index 3f6c289..5b1ec0f 100644 --- a/include/Network/network.hpp +++ b/include/Network/network.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #endif void NetReset(); From 333a95262bdcdc2c3b161a74fdcb186ba855ba7b Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sat, 11 Jan 2025 21:50:39 +0100 Subject: [PATCH 3/6] Check port and timeout recv --- src/Network/Core.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index 2211a58..0345cdc 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -111,7 +111,17 @@ void GetServerInfo(std::string Data) { return; } ServerAddr.sin_family = AF_INET; - ServerAddr.sin_port = htons(std::stoi(Data.substr(Data.find(':') + 1))); + + int port = std::stoi(Data.substr(Data.find(':') + 1)); + + if (port < 1 || port > 65535) { + debug("Invalid port number: " + std::to_string(port)); + KillSocket(ISock); + CoreSend("I" + Data + ";"); + return; + } + + ServerAddr.sin_port = htons(port); inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr); if (connect(ISock, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) != 0) { debug("Connection to server failed with error: " + std::to_string(WSAGetLastError())); @@ -129,6 +139,12 @@ void GetServerInfo(std::string Data) { std::string buffer; buffer.resize(1024); + + struct timeval timeout; + timeout.tv_sec = 10; + timeout.tv_usec = 0; + setsockopt(ISock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); + int bytesReceived = recv(ISock, &buffer[0], buffer.size() - 1, 0); if (bytesReceived > 0) { From f4e985976ffd267611448f823a0e0d49e5423612 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sat, 11 Jan 2025 21:55:08 +0100 Subject: [PATCH 4/6] Strip packet letter in log --- src/Network/Core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index 0345cdc..e2a3481 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -90,7 +90,7 @@ void StartSync(const std::string& Data) { } void GetServerInfo(std::string Data) { - debug("Fetching server info of " + Data); + debug("Fetching server info of " + Data.substr(1)); std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); if (IP.find('.') == -1) { From a5d450b6808ad62945cefac066b819005fad79c1 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sat, 11 Jan 2025 22:13:12 +0100 Subject: [PATCH 5/6] Raise buffer and remove timeout --- src/Network/Core.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index e2a3481..d2899d3 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -138,13 +138,8 @@ void GetServerInfo(std::string Data) { } std::string buffer; - buffer.resize(1024); - - struct timeval timeout; - timeout.tv_sec = 10; - timeout.tv_usec = 0; - setsockopt(ISock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); - + buffer.resize(8192); + int bytesReceived = recv(ISock, &buffer[0], buffer.size() - 1, 0); if (bytesReceived > 0) { From 8d4ba6f158fc0491b045e6af2bf9b3401f2240dc Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sun, 12 Jan 2025 16:57:33 +0100 Subject: [PATCH 6/6] Implement size header for info packet --- src/Network/Core.cpp | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index d2899d3..5cec91c 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -90,7 +90,7 @@ void StartSync(const std::string& Data) { } void GetServerInfo(std::string Data) { - debug("Fetching server info of " + Data.substr(1)); + debug("Fetching server info of " + Data.substr(1)); std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); if (IP.find('.') == -1) { @@ -129,6 +129,7 @@ void GetServerInfo(std::string Data) { CoreSend("I" + Data + ";"); return; } + char Code[1] = { 'I' }; if (send(ISock, Code, 1, 0) != 1) { debug("Sending data to server failed with error: " + std::to_string(WSAGetLastError())); @@ -137,13 +138,38 @@ void GetServerInfo(std::string Data) { return; } - std::string buffer; - buffer.resize(8192); - - int bytesReceived = recv(ISock, &buffer[0], buffer.size() - 1, 0); + const std::string buffer = ([&]() -> std::string { + int32_t Header; + std::vector data(sizeof(Header)); + int32_t Temp = recv(ISock, data.data(), sizeof(Header), MSG_WAITALL); - if (bytesReceived > 0) { - buffer.resize(bytesReceived); + auto checkBytes = ([&](const int32_t bytes) -> bool { + if (bytes == 0) { + return false; + } else if (bytes < 0) { + return false; + } + return true; + }); + + if (!checkBytes(Temp)) { + return ""; + } + memcpy(&Header, data.data(), sizeof(Header)); + + if (!checkBytes(Temp)) { + return ""; + } + + data.resize(Header, 0); + Temp = recv(ISock, data.data(), Header, MSG_WAITALL); + if (!checkBytes(Temp)) { + return ""; + } + return std::string(data.data(), Header); + })(); + + if (!buffer.empty()) { debug("Server Info: " + buffer); CoreSend("I" + Data + ";" + buffer);