More work on the server code. Still broken.

This commit is contained in:
lotodore
2007-08-20 20:37:54 +00:00
parent 9d63df9218
commit 67e81d1631
7 changed files with 128 additions and 33 deletions
+4
View File
@@ -57,6 +57,8 @@ HEADERS += \
src/net/resolverthread.h \ src/net/resolverthread.h \
src/net/senderthread.h \ src/net/senderthread.h \
src/net/serveracceptthread.h \ src/net/serveracceptthread.h \
src/net/servergamethread.h \
src/net/servergamestate.h \
src/net/serverlobbythread.h \ src/net/serverlobbythread.h \
src/net/socket_helper.h \ src/net/socket_helper.h \
src/net/socket_msg.h \ src/net/socket_msg.h \
@@ -130,6 +132,8 @@ SOURCES += \
src/net/common/servercontext.cpp \ src/net/common/servercontext.cpp \
src/net/common/serverexception.cpp \ src/net/common/serverexception.cpp \
src/net/common/serveracceptthread.cpp \ src/net/common/serveracceptthread.cpp \
src/net/common/servergamethread.cpp \
src/net/common/servergamestate.cpp \
src/net/common/serverlobbythread.cpp \ src/net/common/serverlobbythread.cpp \
src/net/common/servercallback.cpp \ src/net/common/servercallback.cpp \
src/net/common/sessiondata.cpp \ src/net/common/sessiondata.cpp \
+6 -3
View File
@@ -215,9 +215,10 @@ ServerGameStateInit::~ServerGameStateInit()
{ {
} }
void bool
ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper session) ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper session)
{ {
bool retVal = false;
if (session.sessionData.get() && session.playerData.get()) if (session.sessionData.get() && session.playerData.get())
{ {
size_t curNumPlayers = server.GetCurNumberOfPlayers(); size_t curNumPlayers = server.GetCurNumberOfPlayers();
@@ -253,8 +254,10 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s
session.sessionData->SetState(SessionData::Game); session.sessionData->SetState(SessionData::Game);
// Accept session. // Accept session.
server.GetSessionManager().AddSession(session); server.GetSessionManager().AddSession(session);
retVal = true;
} }
} }
return retVal;
} }
int int
@@ -321,11 +324,11 @@ AbstractServerGameStateRunning::~AbstractServerGameStateRunning()
{ {
} }
void bool
AbstractServerGameStateRunning::HandleNewSession(ServerGameThread &server, SessionWrapper session) AbstractServerGameStateRunning::HandleNewSession(ServerGameThread &server, SessionWrapper session)
{ {
// Do not accept new sessions in this state. // Do not accept new sessions in this state.
server.RejectSession(session); return false;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
+24 -12
View File
@@ -50,12 +50,13 @@ private:
}; };
ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, GuiInterface &gui, ConfigFile *playerConfig) ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const string &name, GuiInterface &gui, ConfigFile *playerConfig)
: m_lobbyThread(lobbyThread), m_gui(gui), m_gameId(0), m_playerConfig(playerConfig), m_curState(NULL) : m_lobbyThread(lobbyThread), m_gui(gui), m_id(id), m_name(name), m_playerConfig(playerConfig), m_curState(NULL), m_gameNum(1)
{ {
m_senderCallback.reset(new ServerSenderCallback(*this)); m_senderCallback.reset(new ServerSenderCallback(*this));
m_sender.reset(new SenderThread(GetSenderCallback())); m_sender.reset(new SenderThread(GetSenderCallback()));
m_receiver.reset(new ReceiverHelper); m_receiver.reset(new ReceiverHelper);
SetState(SERVER_INITIAL_STATE::Instance());
} }
ServerGameThread::~ServerGameThread() ServerGameThread::~ServerGameThread()
@@ -69,10 +70,22 @@ ServerGameThread::Init(const string &pwd, const GameData &gameData)
m_gameData = gameData; m_gameData = gameData;
} }
void u_int32_t
ServerGameThread::GetId() const
{
return m_id;
}
const std::string &
ServerGameThread::GetName() const
{
return m_name;
}
bool
ServerGameThread::AddSession(SessionWrapper session) ServerGameThread::AddSession(SessionWrapper session)
{ {
GetState().HandleNewSession(*this, session); return GetState().HandleNewSession(*this, session);
} }
GameState GameState
@@ -90,7 +103,6 @@ ServerGameThread::SendToAllPlayers(boost::shared_ptr<NetPacket> packet)
void void
ServerGameThread::Main() ServerGameThread::Main()
{ {
SetState(SERVER_INITIAL_STATE::Instance());
GetSender().Run(); GetSender().Run();
try try
@@ -149,7 +161,7 @@ ServerGameThread::InternalStartGame()
SetStartData(startData); SetStartData(startData);
m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), GetNextGameId())); m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), GetNextGameNum()));
} }
void void
@@ -260,12 +272,6 @@ ServerGameThread::AssignPlayerNumbers()
} }
} }
unsigned
ServerGameThread::GetNextGameId()
{
return m_gameId++;
}
SessionManager & SessionManager &
ServerGameThread::GetSessionManager() ServerGameThread::GetSessionManager()
{ {
@@ -369,3 +375,9 @@ ServerGameThread::GetGui()
return m_gui; return m_gui;
} }
unsigned
ServerGameThread::GetNextGameNum()
{
return m_gameNum++;
}
+62 -1
View File
@@ -18,6 +18,7 @@
***************************************************************************/ ***************************************************************************/
#include <net/serverlobbythread.h> #include <net/serverlobbythread.h>
#include <net/servergamethread.h>
#include <net/serverexception.h> #include <net/serverexception.h>
#include <net/senderthread.h> #include <net/senderthread.h>
#include <net/sendercallback.h> #include <net/sendercallback.h>
@@ -54,7 +55,7 @@ private:
ServerLobbyThread::ServerLobbyThread(GuiInterface &gui, ConfigFile *playerConfig) ServerLobbyThread::ServerLobbyThread(GuiInterface &gui, ConfigFile *playerConfig)
: m_gui(gui), m_playerConfig(playerConfig) : m_gui(gui), m_playerConfig(playerConfig), m_curUniquePlayerId(0), m_curGameId(0)
{ {
m_senderCallback.reset(new ServerSenderCallback(*this)); m_senderCallback.reset(new ServerSenderCallback(*this));
m_sender.reset(new SenderThread(GetSenderCallback())); m_sender.reset(new SenderThread(GetSenderCallback()));
@@ -98,6 +99,12 @@ ServerLobbyThread::GetNextUniquePlayerId()
return m_curUniquePlayerId++; return m_curUniquePlayerId++;
} }
u_int32_t
ServerLobbyThread::GetNextGameId()
{
return m_curGameId++;
}
void void
ServerLobbyThread::Main() ServerLobbyThread::Main()
{ {
@@ -250,11 +257,65 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn
void void
ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const NetPacketCreateGame &tmpPacket) ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const NetPacketCreateGame &tmpPacket)
{ {
// Create a new game.
NetPacketCreateGame::Data createGameData;
tmpPacket.GetData(createGameData);
boost::shared_ptr<ServerGameThread> game(
new ServerGameThread(*this, GetNextGameId(), createGameData.gameName, GetGui(), m_playerConfig));
game->Init(createGameData.password, createGameData.gameData);
// Add session to the game.
if (game->AddSession(session))
{
// Remove session from the lobby.
m_sessionManager.RemoveSession(session.sessionData->GetSocket());
// Add game to list.
m_gameMap.insert(GameMap::value_type(game->GetId(), game));
// Start the game.
game->Run();
// Send ack to client.
boost::shared_ptr<NetPacket> createGameAck(new NetPacketCreateGameAck);
NetPacketCreateGameAck::Data createGameAckData;
createGameAckData.gameId = game->GetId();
static_cast<NetPacketCreateGameAck *>(createGameAck.get())->SetData(createGameAckData);
GetSender().Send(session.sessionData->GetSocket(), createGameAck);
}
} }
void void
ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const NetPacketJoinGame &tmpPacket) ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const NetPacketJoinGame &tmpPacket)
{ {
// Join an existing game.
NetPacketJoinGame::Data joinGameData;
tmpPacket.GetData(joinGameData);
GameMap::iterator pos = m_gameMap.find(joinGameData.gameId);
// TODO: handle errors
if (pos != m_gameMap.end())
{
ServerGameThread &game = *pos->second;
if (game.CheckPassword(joinGameData.password))
{
// Add session to the game.
if (game.AddSession(session))
{
// Remove session from the lobby.
m_sessionManager.RemoveSession(session.sessionData->GetSocket());
// Send ack to client.
boost::shared_ptr<NetPacket> joinGameAck(new NetPacketJoinGameAck);
NetPacketJoinGameAck::Data joinGameAckData;
joinGameAckData.gameData = game.GetGameData();
static_cast<NetPacketJoinGameAck *>(joinGameAck.get())->SetData(joinGameAckData);
GetSender().Send(session.sessionData->GetSocket(), joinGameAck);
}
}
}
} }
void void
+3 -3
View File
@@ -47,7 +47,7 @@ public:
virtual void Init() = 0; virtual void Init() = 0;
// Handling of a new TCP connection. // Handling of a new TCP connection.
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0; virtual bool HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0;
// Main processing function of the current state. // Main processing function of the current state.
virtual int Process(ServerGameThread &server) = 0; virtual int Process(ServerGameThread &server) = 0;
@@ -95,7 +95,7 @@ public:
virtual ~AbstractServerGameStateRunning(); virtual ~AbstractServerGameStateRunning();
// Reject new connections. // Reject new connections.
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session); virtual bool HandleNewSession(ServerGameThread &server, SessionWrapper session);
protected: protected:
@@ -113,7 +113,7 @@ public:
virtual void Init() {} virtual void Init() {}
// //
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session); virtual bool HandleNewSession(ServerGameThread &server, SessionWrapper session);
protected: protected:
+23 -14
View File
@@ -25,6 +25,8 @@
#include <gui/guiinterface.h> #include <gui/guiinterface.h>
#include <gamedata.h> #include <gamedata.h>
#include <deque>
#define GAME_THREAD_TERMINATE_TIMEOUT 200 #define GAME_THREAD_TERMINATE_TIMEOUT 200
@@ -40,20 +42,28 @@ class Game;
class ServerGameThread : public Thread class ServerGameThread : public Thread
{ {
public: public:
ServerGameThread(ServerLobbyThread &lobbyThread, GuiInterface &gui, ConfigFile *playerConfig); ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const std::string &name, GuiInterface &gui, ConfigFile *playerConfig);
virtual ~ServerGameThread(); virtual ~ServerGameThread();
void Init(const std::string &pwd, const GameData &gameData); void Init(const std::string &pwd, const GameData &gameData);
void AddSession(SessionWrapper session); u_int32_t GetId() const;
const std::string &GetName() const;
bool AddSession(SessionWrapper session);
ServerCallback &GetCallback(); ServerCallback &GetCallback();
GameState GetCurRound() const; GameState GetCurRound() const;
void SendToAllPlayers(boost::shared_ptr<NetPacket> packet); void SendToAllPlayers(boost::shared_ptr<NetPacket> packet);
bool CheckPassword(const std::string &password) const;
const GameData &GetGameData() const;
protected: protected:
typedef std::deque<SessionWrapper > SessionQueue;
// Main function of the thread. // Main function of the thread.
virtual void Main(); virtual void Main();
@@ -72,8 +82,6 @@ protected:
size_t GetCurNumberOfPlayers() const; size_t GetCurNumberOfPlayers() const;
void AssignPlayerNumbers(); void AssignPlayerNumbers();
unsigned GetNextGameId();
SessionManager &GetSessionManager(); SessionManager &GetSessionManager();
const SessionManager &GetSessionManager() const; const SessionManager &GetSessionManager() const;
ServerLobbyThread &GetLobbyThread(); ServerLobbyThread &GetLobbyThread();
@@ -86,16 +94,15 @@ protected:
Game &GetGame(); Game &GetGame();
const Game &GetGame() const; const Game &GetGame() const;
const GameData &GetGameData() const;
const StartData &GetStartData() const; const StartData &GetStartData() const;
void SetStartData(const StartData &startData); void SetStartData(const StartData &startData);
bool CheckPassword(const std::string &password) const;
ServerSenderCallback &GetSenderCallback(); ServerSenderCallback &GetSenderCallback();
GuiInterface &GetGui(); GuiInterface &GetGui();
unsigned GetNextGameNum();
private: private:
SessionManager m_sessionManager; SessionManager m_sessionManager;
@@ -107,13 +114,15 @@ private:
std::auto_ptr<ServerSenderCallback> m_senderCallback; std::auto_ptr<ServerSenderCallback> m_senderCallback;
GuiInterface &m_gui; GuiInterface &m_gui;
GameData m_gameData; GameData m_gameData;
StartData m_startData; StartData m_startData;
std::auto_ptr<Game> m_game; std::auto_ptr<Game> m_game;
unsigned m_gameId; const u_int32_t m_id;
std::string m_password; std::string m_name;
ConfigFile *m_playerConfig; std::string m_password;
ServerGameState *m_curState; ConfigFile *m_playerConfig;
ServerGameState *m_curState;
unsigned m_gameNum;
friend class AbstractServerGameStateReceiving; friend class AbstractServerGameStateReceiving;
friend class AbstractServerGameStateRunning; friend class AbstractServerGameStateRunning;
+6
View File
@@ -37,6 +37,7 @@
class SenderThread; class SenderThread;
class ReceiverHelper; class ReceiverHelper;
class ServerSenderCallback; class ServerSenderCallback;
class ServerGameThread;
class ConfigFile; class ConfigFile;
struct GameData; struct GameData;
class Game; class Game;
@@ -53,6 +54,7 @@ public:
void CloseSessionDelayed(SessionWrapper session); void CloseSessionDelayed(SessionWrapper session);
u_int32_t GetNextUniquePlayerId(); u_int32_t GetNextUniquePlayerId();
u_int32_t GetNextGameId();
ServerCallback &GetCallback(); ServerCallback &GetCallback();
protected: protected:
@@ -60,6 +62,7 @@ protected:
typedef std::deque<boost::shared_ptr<ConnectData> > ConnectQueue; typedef std::deque<boost::shared_ptr<ConnectData> > ConnectQueue;
typedef std::list<SessionWrapper> SessionList; typedef std::list<SessionWrapper> SessionList;
typedef std::list<std::pair<boost::microsec_timer, boost::shared_ptr<SessionData> > > CloseSessionList; typedef std::list<std::pair<boost::microsec_timer, boost::shared_ptr<SessionData> > > CloseSessionList;
typedef std::map<unsigned, boost::shared_ptr<ServerGameThread> > GameMap;
// Main function of the thread. // Main function of the thread.
virtual void Main(); virtual void Main();
@@ -98,6 +101,8 @@ private:
CloseSessionList m_closeSessionList; CloseSessionList m_closeSessionList;
mutable boost::mutex m_closeSessionListMutex; mutable boost::mutex m_closeSessionListMutex;
GameMap m_gameMap;
std::auto_ptr<ReceiverHelper> m_receiver; std::auto_ptr<ReceiverHelper> m_receiver;
std::auto_ptr<SenderThread> m_sender; std::auto_ptr<SenderThread> m_sender;
std::auto_ptr<ServerSenderCallback> m_senderCallback; std::auto_ptr<ServerSenderCallback> m_senderCallback;
@@ -106,6 +111,7 @@ private:
std::string m_password; std::string m_password;
ConfigFile *m_playerConfig; ConfigFile *m_playerConfig;
u_int32_t m_curUniquePlayerId; u_int32_t m_curUniquePlayerId;
u_int32_t m_curGameId;
}; };
#endif #endif