[Master] Notify server about announce state

Rename structure Server to QueryData
This commit is contained in:
Koncord 2017-04-24 19:58:48 +08:00
parent 841e6a63f8
commit 9643eb6026
11 changed files with 66 additions and 49 deletions

View file

@ -39,6 +39,17 @@ void MasterServer::Thread()
unsigned char packetId = 0; unsigned char packetId = 0;
auto startTime = chrono::steady_clock::now(); auto startTime = chrono::steady_clock::now();
BitStream send;
PacketMasterQuery pmq(peer);
pmq.SetSendStream(&send);
PacketMasterUpdate pmu(peer);
pmu.SetSendStream(&send);
PacketMasterAnnounce pma(peer);
pma.SetSendStream(&send);
while (run) while (run)
{ {
Packet *packet = peer->Receive(); Packet *packet = peer->Receive();
@ -76,10 +87,7 @@ void MasterServer::Thread()
break; break;
case ID_MASTER_QUERY: case ID_MASTER_QUERY:
{ {
BitStream send; pmq.SetServers(reinterpret_cast<map<SystemAddress, QueryData> *>(&servers));
PacketMasterQuery pmq(peer);
pmq.SetSendStream(&send);
pmq.SetServers(reinterpret_cast<map<SystemAddress, Server> *>(&servers));
pmq.Send(packet->systemAddress); pmq.Send(packet->systemAddress);
cout << "Sent info about all " << servers.size() << " servers to " cout << "Sent info about all " << servers.size() << " servers to "
@ -95,10 +103,7 @@ void MasterServer::Thread()
ServerIter it = servers.find(addr); ServerIter it = servers.find(addr);
if (it != servers.end()) if (it != servers.end())
{ {
mwmp::PacketMasterUpdate pmu(peer); pair<SystemAddress, QueryData> pairPtr(it->first, static_cast<QueryData>(it->second));
BitStream send;
pmu.SetSendStream(&send);
pair<SystemAddress, Server> pairPtr(it->first, static_cast<Server>(it->second));
pmu.SetServer(&pairPtr); pmu.SetServer(&pairPtr);
pmu.Send(packet->systemAddress); pmu.Send(packet->systemAddress);
cout << "Sent info about " << addr.ToString() << " to " << packet->systemAddress.ToString() cout << "Sent info about " << addr.ToString() << " to " << packet->systemAddress.ToString()
@ -111,39 +116,51 @@ void MasterServer::Thread()
{ {
ServerIter iter = servers.find(packet->systemAddress); ServerIter iter = servers.find(packet->systemAddress);
PacketMasterAnnounce pma(peer);
pma.SetReadStream(&data); pma.SetReadStream(&data);
SServer server; SServer server;
pma.SetServer(&server); pma.SetServer(&server);
pma.Read(); pma.Read();
switch (pma.GetFunc()) auto keepAliveFunc = [&]() {
{ iter->second.lastUpdate = now;
case PacketMasterAnnounce::FUNCTION_DELETE: pma.SetFunc(PacketMasterAnnounce::FUNCTION_KEEP);
{ pma.Send(packet->systemAddress);
};
if (iter != servers.end()) if (iter != servers.end())
{
if (pma.GetFunc() == PacketMasterAnnounce::FUNCTION_DELETE)
{
servers.erase(iter); servers.erase(iter);
cout << "Deleted"; cout << "Deleted";
break; pma.Send(packet->systemAddress);
} }
case PacketMasterAnnounce::FUNCTION_ANNOUNCE: else if (pma.GetFunc() == PacketMasterAnnounce::FUNCTION_ANNOUNCE)
{ {
if (iter == servers.end())
cout << "Added";
else
cout << "Updated"; cout << "Updated";
iter = servers.insert({packet->systemAddress, server}).first; iter = servers.insert({packet->systemAddress, server}).first;
break; keepAliveFunc();
} }
default: else
{
cout << "Keeping alive"; cout << "Keeping alive";
keepAliveFunc();
}
}
else if(pma.GetFunc() == PacketMasterAnnounce::FUNCTION_ANNOUNCE)
{
cout << "Added";
iter = servers.insert({packet->systemAddress, server}).first;
keepAliveFunc();
}
else
{
cout << "Unknown";
pma.SetFunc(PacketMasterAnnounce::FUNCTION_DELETE);
pma.Send(packet->systemAddress);
} }
cout << " server " << packet->systemAddress.ToString() << endl; cout << " server " << packet->systemAddress.ToString() << endl;
if (pma.GetFunc() != PacketMasterAnnounce::FUNCTION_DELETE)
iter->second.lastUpdate = now;
peer->CloseConnection(packet->systemAddress, true); peer->CloseConnection(packet->systemAddress, true);
break; break;
} }

View file

@ -21,7 +21,7 @@ public:
bool isRunning(); bool isRunning();
void Wait(); void Wait();
struct SServer : Server struct SServer : QueryData
{ {
std::chrono::steady_clock::time_point lastUpdate; std::chrono::steady_clock::time_point lastUpdate;
}; };

View file

@ -59,7 +59,7 @@ int main()
else if (strcmp(message, "send") == 0) else if (strcmp(message, "send") == 0)
{ {
puts("Sending data about server"); puts("Sending data about server");
Server server; QueryData server;
server.SetName("Super Server"); server.SetName("Super Server");
server.SetPlayers(0); server.SetPlayers(0);
server.SetMaxPlayers(0); server.SetMaxPlayers(0);
@ -152,7 +152,7 @@ int main()
break; break;
case ID_MASTER_QUERY: case ID_MASTER_QUERY:
{ {
map<SystemAddress, Server> servers; map<SystemAddress, QueryData> servers;
pmq.SetReadStream(&data); pmq.SetReadStream(&data);
pmq.SetServers(&servers); pmq.SetServers(&servers);
@ -167,7 +167,7 @@ int main()
} }
case ID_MASTER_UPDATE: case ID_MASTER_UPDATE:
{ {
pair<SystemAddress, Server> serverPair; pair<SystemAddress, QueryData> serverPair;
PacketMasterUpdate pmu(peer); PacketMasterUpdate pmu(peer);
pmu.SetReadStream(&data); pmu.SetReadStream(&data);
pmu.SetServer(&serverPair); pmu.SetServer(&serverPair);

View file

@ -32,9 +32,9 @@ struct Plugin
unsigned long hash; unsigned long hash;
}; };
struct Server struct QueryData
{ {
Server() QueryData()
{ {
rules["name"].type = 's'; rules["name"].type = 's';
rules["name"].str = ""; rules["name"].str = "";

View file

@ -29,7 +29,7 @@ void PacketMasterAnnounce::Packet(BitStream *bs, bool send)
ProxyMasterPacket::addServer(this, *server, send); ProxyMasterPacket::addServer(this, *server, send);
} }
void PacketMasterAnnounce::SetServer(Server *_server) void PacketMasterAnnounce::SetServer(QueryData *_server)
{ {
server = _server; server = _server;
} }

View file

@ -19,7 +19,7 @@ namespace mwmp
virtual void Packet(RakNet::BitStream *bs, bool send); virtual void Packet(RakNet::BitStream *bs, bool send);
void SetServer(Server *server); void SetServer(QueryData *server);
void SetFunc(int keep); void SetFunc(int keep);
int GetFunc(); int GetFunc();
@ -30,7 +30,7 @@ namespace mwmp
FUNCTION_KEEP FUNCTION_KEEP
}; };
private: private:
Server *server; QueryData *server;
int func; int func;
}; };
} }

View file

@ -29,11 +29,11 @@ void PacketMasterQuery::Packet(RakNet::BitStream *bs, bool send)
RW(serversCount, send); RW(serversCount, send);
map<SystemAddress, Server>::iterator serverIt; map<SystemAddress, QueryData>::iterator serverIt;
if(send) if(send)
serverIt = servers->begin(); serverIt = servers->begin();
Server server; QueryData server;
SystemAddress sa; SystemAddress sa;
while(serversCount--) while(serversCount--)
{ {
@ -49,12 +49,12 @@ void PacketMasterQuery::Packet(RakNet::BitStream *bs, bool send)
if(send) if(send)
serverIt++; serverIt++;
else else
servers->insert(pair<SystemAddress, Server>(sa, server)); servers->insert(pair<SystemAddress, QueryData>(sa, server));
} }
} }
void PacketMasterQuery::SetServers(map<SystemAddress, Server> *serverMap) void PacketMasterQuery::SetServers(map<SystemAddress, QueryData> *serverMap)
{ {
servers = serverMap; servers = serverMap;
} }

View file

@ -19,9 +19,9 @@ namespace mwmp
virtual void Packet(RakNet::BitStream *bs, bool send); virtual void Packet(RakNet::BitStream *bs, bool send);
void SetServers(std::map<RakNet::SystemAddress, Server> *serverMap); void SetServers(std::map<RakNet::SystemAddress, QueryData> *serverMap);
private: private:
std::map<RakNet::SystemAddress, Server> *servers; std::map<RakNet::SystemAddress, QueryData> *servers;
}; };
} }

View file

@ -28,7 +28,7 @@ void PacketMasterUpdate::Packet(RakNet::BitStream *bs, bool send)
} }
void PacketMasterUpdate::SetServer(std::pair<RakNet::SystemAddress, Server> *serverPair) void PacketMasterUpdate::SetServer(std::pair<RakNet::SystemAddress, QueryData> *serverPair)
{ {
server = serverPair; server = serverPair;
} }

View file

@ -19,9 +19,9 @@ namespace mwmp
virtual void Packet(RakNet::BitStream *bs, bool send); virtual void Packet(RakNet::BitStream *bs, bool send);
void SetServer(std::pair<RakNet::SystemAddress, Server> *serverPair); void SetServer(std::pair<RakNet::SystemAddress, QueryData> *serverPair);
private: private:
std::pair<RakNet::SystemAddress, Server> *server; std::pair<RakNet::SystemAddress, QueryData> *server;
}; };
} }

View file

@ -21,7 +21,7 @@ namespace mwmp
public: public:
template<class Packet> template<class Packet>
static void addServer(Packet *packet, Server &server, bool send) static void addServer(Packet *packet, QueryData &server, bool send)
{ {
using namespace std; using namespace std;