Network protocol and invalidation stuff.
This commit is contained in:
parent
b350c3774b
commit
b0e0b1ff2f
@ -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)
|
||||
{
|
||||
|
@ -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<char*>(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<Node::NodeEntry> 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<Node::DediEntry> 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;
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user