From 548c7980cc9b2e2334589a70d6ee0b6a8bcdf6c6 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Wed, 10 Jun 2015 20:17:04 -0400 Subject: [PATCH] Added server pinging/timeouts. --- Release/Plugins/RenX.Core.lib | Bin 128368 -> 128368 bytes RenX.Core/RenX_Server.cpp | 28 +++++++++++++++++++++++++++- RenX.Core/RenX_Server.h | 4 ++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 564c6cf7de754277420620f060ac69f44ea6a8f1..325f671f8d982cdcae21dd4e6f24e80ba39106e5 100644 GIT binary patch delta 8635 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 diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 63d1871..914794c 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -29,6 +29,8 @@ #include "RenX_BanDatabase.h" #include "RenX_Tags.h" +using namespace Jupiter::literals; + int RenX::Server::think() { if (RenX::Server::connected == false) @@ -45,6 +47,11 @@ int RenX::Server::think() else return 1; } + else if (RenX::Server::awaitingPong && std::chrono::steady_clock::now() - RenX::Server::lastActivity >= RenX::Server::pingTimeoutThreshold) // ping timeout + { + RenX::Server::sendLogChan(STRING_LITERAL_AS_REFERENCE(IRCCOLOR "04[Error]" IRCCOLOR " Disconnected from Renegade-X server (ping timeout).")); + RenX::Server::disconnect(); + } else { if (RenX::Server::sock.recv() > 0) @@ -54,6 +61,7 @@ int RenX::Server::think() if (totalLines != 0) { + RenX::Server::lastActivity = std::chrono::steady_clock::now(); RenX::Server::lastLine.concat(buffer.getToken(0, '\n')); if (totalLines != 1) // if there's only one token, there is no newline. { @@ -65,7 +73,16 @@ int RenX::Server::think() } } } - else if (Jupiter::Socket::getLastError() != 10035) // This is a serious error + else if (Jupiter::Socket::getLastError() == 10035) + { + if (RenX::Server::awaitingPong == false && std::chrono::steady_clock::now() - RenX::Server::lastActivity >= RenX::Server::pingRate) + { + RenX::Server::lastActivity = std::chrono::steady_clock::now(); + RenX::Server::sock.send("cping\n"_jrs); + RenX::Server::awaitingPong = true; + } + } + else // This is a serious error { RenX::Server::wipeData(); if (RenX::Server::maxAttempts != 0) @@ -83,6 +100,7 @@ int RenX::Server::think() } return 0; } + if (RenX::Server::rconVersion >= 3 && RenX::Server::players.size() != 0) { if (RenX::Server::clientUpdateRate != std::chrono::milliseconds::zero() && std::chrono::steady_clock::now() > RenX::Server::lastClientListUpdate + RenX::Server::clientUpdateRate) @@ -1373,6 +1391,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } buff.shiftLeft(1); } + else if (this->lastCommand.equalsi("ping")) + RenX::Server::awaitingPong = false; else if (this->lastCommand.equalsi("map")) this->map = buff.substring(1); else if (this->lastCommand.equalsi("serverinfo")) @@ -2381,7 +2401,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) buff.shiftLeft(1); } else + { + RenX::Server::sendLogChan(STRING_LITERAL_AS_REFERENCE(IRCCOLOR "04[Error]" IRCCOLOR " Disconnected from Renegade-X server (incompatible RCON version).")); this->disconnect(); + } break; case 'a': @@ -2436,6 +2459,7 @@ bool RenX::Server::reconnect() void RenX::Server::wipeData() { + RenX::Server::awaitingPong = false; RenX::Server::rconVersion = 0; RenX::Server::rconUser.truncate(RenX::Server::rconUser.size()); while (RenX::Server::players.size() != 0) @@ -2501,6 +2525,8 @@ void RenX::Server::init() RenX::Server::neverSay = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("NeverSay"), false); RenX::Server::clientUpdateRate = std::chrono::milliseconds(Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("ClientUpdateRate"), 2500)); RenX::Server::buildingUpdateRate = std::chrono::milliseconds(Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("BuildingUpdateRate"), 7500)); + RenX::Server::pingRate = std::chrono::milliseconds(Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("PingUpdateRate"), 60000)); + RenX::Server::pingTimeoutThreshold = std::chrono::milliseconds(Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("PingTimeoutThreshold"), 10000)); Jupiter::INIFile &commandsFile = RenX::getCore()->getCommandsFile(); RenX::Server::commandAccessLevels = commandsFile.getSection(RenX::Server::configSection); diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 71abd4c..9101623 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -813,11 +813,13 @@ namespace RenX bool firstKill = false; bool firstDeath = false; bool firstAction = false; + bool awaitingPong = false; unsigned int rconVersion = 0; time_t lastAttempt = 0; int attempts = 0; std::chrono::steady_clock::time_point lastClientListUpdate = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point lastBuildingListUpdate = std::chrono::steady_clock::now(); + std::chrono::steady_clock::time_point lastActivity = std::chrono::steady_clock::now(); Jupiter::String lastLine; Jupiter::StringS commandListFormat; Jupiter::StringS gameVersion; @@ -831,6 +833,8 @@ namespace RenX int maxAttempts; std::chrono::milliseconds clientUpdateRate; std::chrono::milliseconds buildingUpdateRate; + std::chrono::milliseconds pingRate; + std::chrono::milliseconds pingTimeoutThreshold; int steamFormat; /** 16 = hex, 10 = base 10, 8 = octal, -2 = SteamID 2, -3 = SteamID 3 */ bool rconBan; bool localBan;