More work on the server code. Still broken.
This commit is contained in:
@@ -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 \
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -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++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -110,10 +117,12 @@ private:
|
|||||||
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_name;
|
||||||
std::string m_password;
|
std::string m_password;
|
||||||
ConfigFile *m_playerConfig;
|
ConfigFile *m_playerConfig;
|
||||||
ServerGameState *m_curState;
|
ServerGameState *m_curState;
|
||||||
|
unsigned m_gameNum;
|
||||||
|
|
||||||
friend class AbstractServerGameStateReceiving;
|
friend class AbstractServerGameStateReceiving;
|
||||||
friend class AbstractServerGameStateRunning;
|
friend class AbstractServerGameStateRunning;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user