Moved the connection code to server_connections.cpp

This commit is contained in:
Kayne Ruse
2014-12-03 00:46:38 +11:00
parent 61f462a882
commit de4e539449
4 changed files with 240 additions and 189 deletions
+3 -189
View File
@@ -25,192 +25,6 @@
#include <iostream>
#include <sstream>
//-------------------------
//these should've come standard
//-------------------------
bool operator==(IPaddress lhs, IPaddress rhs) {
return lhs.host == rhs.host && lhs.port == rhs.port;
}
bool operator!=(IPaddress lhs, IPaddress rhs) {
return !(lhs == rhs);
}
//-------------------------
//heartbeat system
//-------------------------
void ServerApplication::HandlePing(ServerPacket* const argPacket) {
ServerPacket newPacket;
newPacket.type = SerialPacketType::PONG;
network.SendTo(argPacket->srcAddress, &newPacket);
}
void ServerApplication::HandlePong(ServerPacket* const argPacket) {
clientMgr.HandlePong(argPacket);
}
//-------------------------
//basic connections
//-------------------------
void ServerApplication::HandleBroadcastRequest(ServerPacket* const argPacket) {
//send the server's data
ServerPacket newPacket;
newPacket.type = SerialPacketType::BROADCAST_RESPONSE;
strncpy(newPacket.name, config["server.name"].c_str(), PACKET_STRING_SIZE);
newPacket.playerCount = characterMgr.GetLoadedCount();
newPacket.version = NETWORK_VERSION;
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
}
void ServerApplication::HandleJoinRequest(ClientPacket* const argPacket) {
//register the client
int clientIndex = clientMgr.Create(argPacket->srcAddress);
//send the client their info
ClientPacket newPacket;
newPacket.type = SerialPacketType::JOIN_RESPONSE;
newPacket.clientIndex = clientIndex;
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
//finished this routine
std::cout << "New join, " << clientMgr.GetLoadedCount() << " clients and " << accountMgr.GetLoadedCount() << " accounts total" << std::endl;
}
void ServerApplication::HandleLoginRequest(ClientPacket* const argPacket) {
//get the client data
ClientData* clientData = clientMgr.Get(argPacket->clientIndex);
if (clientData == nullptr || clientData->GetAddress() != argPacket->srcAddress) {
std::cerr << "Falsified client index detected: " << argPacket->clientIndex << std::endl;
return;
}
//load the user account
int accountIndex = accountMgr.Load(argPacket->username, argPacket->clientIndex);
//Cannot load
if (accountIndex < 0) {
//build the message
std::ostringstream msg;
msg << "Account already loaded: " << argPacket->username;
//build the packet
TextPacket newPacket;
newPacket.type = SerialPacketType::LOGIN_REJECTION;
strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE);
network.SendTo(clientData->GetAddress(), static_cast<SerialPacket*>(&newPacket));
//log the error
std::cerr << "Error message sent: " << newPacket.text << std::endl;
return;
}
//send the client their info
ClientPacket newPacket;
newPacket.type = SerialPacketType::LOGIN_RESPONSE;
newPacket.clientIndex = argPacket->clientIndex;
newPacket.accountIndex = accountIndex;
network.SendTo(clientData->GetAddress(), static_cast<SerialPacket*>(&newPacket));
//finished this routine
std::cout << "New login, " << clientMgr.GetLoadedCount() << " clients and " << accountMgr.GetLoadedCount() << " accounts total" << std::endl;
}
void ServerApplication::HandleLogoutRequest(ClientPacket* const argPacket) {
//get the account and client data
AccountData* accountData = accountMgr.Get(argPacket->accountIndex);
if (!accountData) {
return;
}
ClientData* clientData = clientMgr.Get(accountData->GetClientIndex());
if (!clientData) {
std::ostringstream msg;
msg << "No client found for an account: " << accountData->GetUsername();
throw(std::logic_error(msg.str()));
}
//check for fraud
if (clientData->GetAddress() != argPacket->srcAddress) {
std::cerr << "Falsified logout detected targeting: " << accountData->GetUsername() << std::endl;
return;
}
//send the logout response
ClientPacket newPacket;
newPacket.type = SerialPacketType::LOGOUT_RESPONSE;
newPacket.accountIndex = argPacket->accountIndex;
network.SendTo(clientData->GetAddress(), static_cast<SerialPacket*>(&newPacket));
//save and unload this accounts characters
characterMgr.UnloadIf([&](std::pair<int, CharacterData> it) -> bool {
if (argPacket->accountIndex == it.second.GetOwner()) {
//pump the unload message to all remaining clients
// PumpCharacterUnload(it.first);
return true;
}
return false;
});
//unload this account
accountMgr.Unload(argPacket->accountIndex);
//finished this routine
std::cout << "New logout, " << clientMgr.GetLoadedCount() << " clients and " << accountMgr.GetLoadedCount() << " accounts total" << std::endl;
}
void ServerApplication::HandleDisconnectRequest(ClientPacket* const argPacket) {
//get the client data
ClientData* clientData = clientMgr.Get(argPacket->clientIndex);
if (!clientData) {
return;
}
//check for fraud
if (clientData->GetAddress() != argPacket->srcAddress) {
std::cerr << "Falsified disconnection detected targeting: " << argPacket->clientIndex << std::endl;
return;
}
//send the disconnect response
ClientPacket newPacket;
newPacket.type = SerialPacketType::DISCONNECT_RESPONSE;
newPacket.clientIndex = argPacket->clientIndex;
network.SendTo(clientData->GetAddress(), static_cast<SerialPacket*>(&newPacket));
//TODO: need a method for this redundunt chunk of redundant code
//find and unload the accounts associated with this client
accountMgr.UnloadIf([&](std::pair<const int, AccountData> account) -> bool {
if (account.second.GetClientIndex() == argPacket->clientIndex) {
//find and unload the characters associated with this account
characterMgr.UnloadIf([&](std::pair<const int, CharacterData> character) -> bool {
if (character.second.GetOwner() == account.first) {
// PumpCharacterUnload(character.first);
return true;
}
return false;
});
return true;
}
return false;
});
//unload this client
clientMgr.Unload(argPacket->clientIndex);
//finished this routine
std::cout << "New disconnection, " << clientMgr.GetLoadedCount() << " clients and " << accountMgr.GetLoadedCount() << " accounts total" << std::endl;
}
//-------------------------
//server commands
//-------------------------
@@ -261,9 +75,9 @@ void ServerApplication::HandleShutdownRequest(ClientPacket* const argPacket) {
running = false;
//disconnect all clients
// ClientPacket newPacket;
// newPacket.type = SerialPacketType::DISCONNECT_FORCED;
// PumpPacket(&newPacket);
//ClientPacket newPacket;
//newPacket.type = SerialPacketType::DISCONNECT_FORCED;
//PumpPacket(&newPacket);
//finished this routine
std::cout << "Shutdown signal accepted" << std::endl;