From b6763bcfe846e6bf1399a2f49b015feb4cedfa89 Mon Sep 17 00:00:00 2001 From: Kai Philipp Date: Wed, 29 Jun 2016 18:06:28 +0200 Subject: [PATCH] number of guests limited --- src/net/common/netpacket.cpp | 3 +++ src/net/common/serverlobbythread.cpp | 23 ++++++++++++++++++++--- src/net/common/sessionmanager.cpp | 15 +++++++++++++++ src/net/sessionmanager.h | 6 ++++++ src/net/socket_msg.h | 1 + 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/net/common/netpacket.cpp b/src/net/common/netpacket.cpp index c07cc7a7..54b5a1e4 100644 --- a/src/net/common/netpacket.cpp +++ b/src/net/common/netpacket.cpp @@ -248,6 +248,9 @@ NetPacket::GameErrorToNetError(int gameErrorReason) case ERR_NET_SESSION_TIMED_OUT : retVal = ErrorMessage::sessionTimeout; break; + case ERR_NET_TOO_MANY_GUESTS : + retVal = ErrorMessage::initServerFull; // @TODO: maybe create a better error message + break; default : retVal = ErrorMessage::reserved; break; diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 5ad45628..70b1044d 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -65,6 +65,7 @@ #define SERVER_MAX_NUM_LOBBY_SESSIONS 512 // Maximum number of idle users in lobby. #define SERVER_MAX_NUM_TOTAL_SESSIONS 2000 // Total maximum of sessions, fitting a 2048 handle limit +#define SERVER_MAX_GUEST_USERS 150 // Maximum number of guests users allowed #define SERVER_SAVE_STATISTICS_INTERVAL_SEC 60 #define SERVER_CHECK_SESSION_TIMEOUTS_INTERVAL_MSEC 500 @@ -395,8 +396,12 @@ ServerLobbyThread::CloseSession(boost::shared_ptr session) m_sessionManager.RemoveSession(session->GetId()); m_gameSessionManager.RemoveSession(session->GetId()); - if (session->GetPlayerData()) + if (session->GetPlayerData()){ + if (session->GetPlayerData()->GetRights() == PLAYER_RIGHTS_GUEST){ + m_sessionManager.DecrementGuest(); + } NotifyPlayerLeftLobby(session->GetPlayerData()->GetUniqueId()); + } // Update stats (if needed). UpdateStatisticsNumberOfPlayers(); @@ -1010,6 +1015,7 @@ ServerLobbyThread::HandleNetPacketInit(boost::shared_ptr session, c // @XXX: debug tests //if(m_sessionManager.IsGuestConnectedMultiple(session->GetClientAddr())){ // LOG_ERROR("Guest with IP " << session->GetClientAddr() << " already connected! Should be declined!"); + //LOG_ERROR("number of guests (before this session is accepted) = " << m_sessionManager.GetGuestUsers() << "."); //} // @XXX: end debug tests @@ -1053,7 +1059,9 @@ ServerLobbyThread::HandleNetPacketInit(boost::shared_ptr session, c MD5Buf avatarMD5; bool noAuth = false; bool validGuest = false; - if (initMessage.login() == InitMessage::guestLogin) { + // @XXX: productive: if (initMessage.login() == InitMessage::guestLogin) { + // @XXX: debug: if (initMessage.login() == InitMessage::unauthenticatedLogin) { + if (initMessage.login() == InitMessage::guestLogin) { playerName = initMessage.nickname(); // Verify guest player name. if (playerName.length() > sizeof(SERVER_GUEST_PLAYER_NAME - 1) @@ -1066,7 +1074,12 @@ ServerLobbyThread::HandleNetPacketInit(boost::shared_ptr session, c // @XXX: check if a guest session with same ip is already connected - decline if true if(m_sessionManager.IsGuestConnectedMultiple(session->GetClientAddr())){ //LOG_ERROR("Guest with IP " << session->GetClientAddr() << " already connected! Decline!"); - validGuest = false; + SessionError(session, ERR_NET_TOO_MANY_GUESTS); + return; + } + if (m_sessionManager.GetGuestUsers() >= SERVER_MAX_GUEST_USERS) { + SessionError(session, ERR_NET_TOO_MANY_GUESTS); + return; } } if (!validGuest) { @@ -1133,6 +1146,10 @@ ServerLobbyThread::HandleNetPacketInit(boost::shared_ptr session, c m_sessionManager.SetSessionPlayerData(session->GetId(), tmpPlayerData); session->SetPlayerData(tmpPlayerData); + if (validGuest){ + m_sessionManager.IncrementGuest(); + } + if (noAuth) InitAfterLogin(session); else diff --git a/src/net/common/sessionmanager.cpp b/src/net/common/sessionmanager.cpp index 2dba6d39..88adb3bc 100644 --- a/src/net/common/sessionmanager.cpp +++ b/src/net/common/sessionmanager.cpp @@ -39,6 +39,7 @@ using namespace std; SessionManager::SessionManager() { + guestUsers = 0; } SessionManager::~SessionManager() @@ -433,3 +434,17 @@ SessionManager::SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr< } } +void +SessionManager::IncrementGuest() { + guestUsers++; +} + +void +SessionManager::DecrementGuest() { + guestUsers--; +} + +int +SessionManager::GetGuestUsers() const { + return guestUsers; +} \ No newline at end of file diff --git a/src/net/sessionmanager.h b/src/net/sessionmanager.h index 5eec02fc..9fb2918c 100644 --- a/src/net/sessionmanager.h +++ b/src/net/sessionmanager.h @@ -79,6 +79,10 @@ public: void SendToAllSessions(SenderHelper &sender, boost::shared_ptr packet, int state); void SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr packet, int state); void SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr packet, SessionId except, int state); + + void IncrementGuest(); + void DecrementGuest(); + int GetGuestUsers() const; protected: @@ -88,6 +92,8 @@ private: SessionMap m_sessionMap; mutable boost::recursive_mutex m_sessionMapMutex; + + int guestUsers; }; #endif diff --git a/src/net/socket_msg.h b/src/net/socket_msg.h index d65fe604..5a0499e8 100644 --- a/src/net/socket_msg.h +++ b/src/net/socket_msg.h @@ -98,6 +98,7 @@ #define ERR_NET_GSASL_INIT_FAILED 134 #define ERR_NET_GSASL_NO_SCRAM 135 #define ERR_NET_DB_CONNECT_FAILED 136 +#define ERR_NET_TOO_MANY_GUESTS 137 #define ERR_IRC_INTERNAL 151 #define ERR_IRC_CONNECT_FAILED 152