forked from teamnwah/openmw-tes3coop
[Master] Notify server about announce state
Rename structure Server to QueryData
This commit is contained in:
parent
841e6a63f8
commit
9643eb6026
11 changed files with 66 additions and 49 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 = "";
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue