diff --git a/src/Components/Modules/Network.cpp b/src/Components/Modules/Network.cpp index 14d46722..250cde61 100644 --- a/src/Components/Modules/Network.cpp +++ b/src/Components/Modules/Network.cpp @@ -15,11 +15,11 @@ namespace Components } void Network::Address::SetPort(unsigned short port) { - this->address.port = htons(port); + this->address.port = ntohs(port); }; unsigned short Network::Address::GetPort() { - return ntohs(this->address.port); + return htons(this->address.port); } void Network::Address::SetIP(DWORD ip) { diff --git a/src/Components/Modules/Node.cpp b/src/Components/Modules/Node.cpp index 4d0d04e2..204a4552 100644 --- a/src/Components/Modules/Node.cpp +++ b/src/Components/Modules/Node.cpp @@ -27,10 +27,13 @@ namespace Components for (auto entry : Node::Nodes) { - Node::AddressEntry thisAddress; - thisAddress.fromNetAddress(entry.address); + if (entry.state == Node::STATE_VALID) + { + Node::AddressEntry thisAddress; + thisAddress.fromNetAddress(entry.address); - entries.push_back(thisAddress); + entries.push_back(thisAddress); + } } std::string nodeStream(reinterpret_cast(entries.data()), entries.size() * sizeof(Node::AddressEntry)); @@ -121,7 +124,7 @@ namespace Components for (auto entry : Node::Nodes) { - if (entry.state != Node::STATE_INVALID) // Only send valid nodes, or shall we send invalid ones as well? + if (entry.state == Node::STATE_VALID) // Only send valid nodes, or shall we send invalid ones as well? { Node::AddressEntry thisAddress; thisAddress.fromNetAddress(entry.address); @@ -187,6 +190,52 @@ namespace Components } } + void Node::DeleteInvalidNodes() + { + std::vector cleanNodes; + + for (auto node : Node::Nodes) + { + if (node.state != Node::STATE_INVALID) + { + cleanNodes.push_back(node); + } + else + { + Logger::Print("Removing invalid node %s\n", node.address.GetString()); + } + } + + if (cleanNodes.size() != Node::Nodes.size()) + { + Node::Nodes.clear(); + Utils::Merge(&Node::Nodes, cleanNodes); + } + } + + void Node::DeleteInvalidDedis() + { + std::vector cleanDedis; + + for (auto dedi : Node::Dedis) + { + if (dedi.state != Node::STATE_INVALID) + { + cleanDedis.push_back(dedi); + } + else + { + Logger::Print("Removing invalid dedi %s\n", dedi.address.GetString()); + } + } + + if (cleanDedis.size() != Node::Dedis.size()) + { + Node::Dedis.clear(); + Utils::Merge(&Node::Dedis, cleanDedis); + } + } + Node::Node() { //#ifdef USE_NODE_STUFF @@ -205,7 +254,7 @@ namespace Components { for (auto node : Node::Nodes) { - Network::Send(node.address, "heartbeatDeadline\n"); + Network::Send(node.address, "deadline\n"); } }); } @@ -271,18 +320,27 @@ namespace Components Node::AddDedi(address, true); }); - Network::Handle("heartbeatDeadline", [] (Network::Address address, std::string data) + Network::Handle("deadline", [] (Network::Address address, std::string data) { + Logger::Print("Invalidation message received from %s\n", address.GetString()); + for (auto &dedi : Node::Dedis) { if (dedi.address == address) { - Logger::Print("Dedi invalidation message received from %s\n", address.GetString()); - dedi.state = Node::STATE_INVALID; dedi.endTime = Game::Com_Milliseconds(); } } + + for (auto &node : Node::Nodes) + { + if (node.address == address) + { + node.state = Node::STATE_INVALID; + node.endTime = Game::Com_Milliseconds(); + } + } }); Dedicated::OnFrame([] () @@ -364,6 +422,9 @@ namespace Components } } + Node::DeleteInvalidNodes(); + Node::DeleteInvalidDedis(); + count = 0; }); diff --git a/src/Components/Modules/Node.hpp b/src/Components/Modules/Node.hpp index d9103b7a..130b2ec8 100644 --- a/src/Components/Modules/Node.hpp +++ b/src/Components/Modules/Node.hpp @@ -1,5 +1,5 @@ -#define HEARTBEAT_DEADLINE 1000 * 3 * 10 // Invalidate servers after 10 minutes without heartbeat -#define HEARTBEAT_INTERVAL 1000 * 10 * 1 // Send heartbeats to each node every 3 minutes +#define HEARTBEAT_DEADLINE 1000 * 60 * 10 // Invalidate servers after 10 minutes without heartbeat +#define HEARTBEAT_INTERVAL 1000 * 60 * 3 // Send heartbeats to each node every 3 minutes #define NODE_VALIDITY_EXPIRE 1000 * 60 * 2 // Revalidate nodes after 2 minutes #define DEDI_VALIDITY_EXPIRE 1000 * 60 * 2 // Revalidate dedis after 2 minutes @@ -60,7 +60,7 @@ namespace Components Network::Address address; address.SetIP(this->ip); - address.SetPort(ntohs(this->port)); + address.SetPort(this->port); address.SetType(Game::netadrtype_t::NA_IP); return address; @@ -69,7 +69,7 @@ namespace Components void fromNetAddress(Network::Address address) { this->ip = address.GetIP(); - this->port = htons(address.GetPort()); + this->port = address.GetPort(); } }; #pragma pack(pop) @@ -85,5 +85,8 @@ namespace Components static void SendNodeList(Network::Address target); static void SendDediList(Network::Address target); + + static void DeleteInvalidNodes(); + static void DeleteInvalidDedis(); }; }