Fixed sender again, as it did not work when sending errors.

This commit is contained in:
lotodore
2007-10-28 15:06:57 +00:00
parent e951bda1db
commit cdea81b2ba
12 changed files with 104 additions and 148 deletions
+2 -6
View File
@@ -34,10 +34,7 @@ public:
virtual SOCKET GetSocket() const; virtual SOCKET GetSocket() const;
void SetSocket(SOCKET sockfd); void SetSocket(SOCKET sockfd);
SessionId GetSessionId() const boost::shared_ptr<SessionData> GetSessionData() const;
{return m_sessionId;}
void SetSessionId(SessionId sessionId)
{m_sessionId = sessionId;}
int GetProtocol() const int GetProtocol() const
{return m_protocol;} {return m_protocol;}
void SetProtocol(int protocol) void SetProtocol(int protocol)
@@ -78,8 +75,7 @@ public:
{return m_receiveBuffer;} {return m_receiveBuffer;}
private: private:
SOCKET m_sockfd; boost::shared_ptr<SessionData> m_sessionData;
SessionId m_sessionId;
int m_protocol; int m_protocol;
int m_addrFamily; int m_addrFamily;
std::string m_serverAddr; std::string m_serverAddr;
+10 -5
View File
@@ -20,26 +20,31 @@
#include <net/clientcontext.h> #include <net/clientcontext.h>
ClientContext::ClientContext() ClientContext::ClientContext()
: m_sockfd(INVALID_SOCKET), m_sessionId(SESSION_ID_GENERIC), m_protocol(0), m_addrFamily(AF_INET), m_serverPort(0) : m_protocol(0), m_addrFamily(AF_INET), m_serverPort(0)
{ {
bzero(&m_clientSockaddr, sizeof(m_clientSockaddr)); bzero(&m_clientSockaddr, sizeof(m_clientSockaddr));
} }
ClientContext::~ClientContext() ClientContext::~ClientContext()
{ {
if (m_sockfd != INVALID_SOCKET)
CLOSESOCKET(m_sockfd);
} }
SOCKET SOCKET
ClientContext::GetSocket() const ClientContext::GetSocket() const
{ {
return m_sockfd; assert(m_sessionData.get());
return m_sessionData->GetSocket();
} }
void void
ClientContext::SetSocket(SOCKET sockfd) ClientContext::SetSocket(SOCKET sockfd)
{ {
m_sockfd = sockfd; m_sessionData.reset(new SessionData(sockfd, SESSION_ID_GENERIC));
}
boost::shared_ptr<SessionData>
ClientContext::GetSessionData() const
{
return m_sessionData;
} }
+3 -3
View File
@@ -362,7 +362,7 @@ ClientStateStartSession::Process(ClientThread &client)
boost::shared_ptr<NetPacket> packet(new NetPacketInit); boost::shared_ptr<NetPacket> packet(new NetPacketInit);
((NetPacketInit *)packet.get())->SetData(initData); ((NetPacketInit *)packet.get())->SetData(initData);
client.GetSender().Send(context.GetSessionId(), packet); client.GetSender().Send(context.GetSessionData(), packet);
client.SetState(ClientStateWaitSession::Instance()); client.SetState(ClientStateWaitSession::Instance());
@@ -592,7 +592,7 @@ ClientStateWaitSession::InternalProcess(ClientThread &client, boost::shared_ptr<
tmpList); tmpList);
if (!avatarError) if (!avatarError)
client.GetSender().SendLowPrio(client.GetContext().GetSessionId(), tmpList); client.GetSender().SendLowPrio(client.GetContext().GetSessionData(), tmpList);
else else
throw ClientException(__FILE__, __LINE__, avatarError, 0); throw ClientException(__FILE__, __LINE__, avatarError, 0);
} }
@@ -740,7 +740,7 @@ ClientStateSynchronizeStart::Process(ClientThread &client)
if (client.IsSynchronized()) if (client.IsSynchronized())
{ {
boost::shared_ptr<NetPacket> startAck(new NetPacketStartEventAck); boost::shared_ptr<NetPacket> startAck(new NetPacketStartEventAck);
client.GetSender().Send(client.GetContext().GetSessionId(), startAck); client.GetSender().Send(client.GetContext().GetSessionData(), startAck);
client.SetState(ClientStateWaitStart::Instance()); client.SetState(ClientStateWaitStart::Instance());
} }
+3 -9
View File
@@ -42,12 +42,6 @@ public:
ClientSenderCallback(ClientThread &client) : m_client(client) {} ClientSenderCallback(ClientThread &client) : m_client(client) {}
virtual ~ClientSenderCallback() {} virtual ~ClientSenderCallback() {}
virtual bool GetSocketForSession(SessionId session, SOCKET &outSocket)
{
assert(session == m_client.GetContext().GetSessionId());
outSocket = m_client.GetContext().GetSocket();
return true;
}
virtual void SignalNetError(SessionId /*session*/, int errorID, int osErrorID) virtual void SignalNetError(SessionId /*session*/, int errorID, int osErrorID)
{ {
// Just signal the error. // Just signal the error.
@@ -374,7 +368,7 @@ ClientThread::SendPacketLoop()
while (i != end) while (i != end)
{ {
GetSender().Send(GetContext().GetSessionId(), *i); GetSender().Send(GetContext().GetSessionData(), *i);
++i; ++i;
} }
m_outPacketList.clear(); m_outPacketList.clear();
@@ -405,7 +399,7 @@ ClientThread::RequestPlayerInfo(unsigned id)
NetPacketRetrievePlayerInfo::Data reqData; NetPacketRetrievePlayerInfo::Data reqData;
reqData.playerId = id; reqData.playerId = id;
static_cast<NetPacketRetrievePlayerInfo *>(req.get())->SetData(reqData); static_cast<NetPacketRetrievePlayerInfo *>(req.get())->SetData(reqData);
GetSender().Send(GetContext().GetSessionId(), req); GetSender().Send(GetContext().GetSessionData(), req);
m_playerInfoRequestList.push_back(id); m_playerInfoRequestList.push_back(id);
} }
@@ -443,7 +437,7 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv
retrieveAvatarData.requestId = id; retrieveAvatarData.requestId = id;
retrieveAvatarData.avatar = info.avatar; retrieveAvatarData.avatar = info.avatar;
static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData); static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData);
GetSender().Send(GetContext().GetSessionId(), retrieveAvatar); GetSender().Send(GetContext().GetSessionData(), retrieveAvatar);
// Insert empty value in list to synchronize waiting. // Insert empty value in list to synchronize waiting.
m_tempAvatarMap[id] = boost::shared_ptr<AvatarData>(); m_tempAvatarMap[id] = boost::shared_ptr<AvatarData>();
+18 -27
View File
@@ -28,7 +28,7 @@ using namespace std;
SenderThread::SenderThread(SenderCallback &cb) SenderThread::SenderThread(SenderCallback &cb)
: m_curSession(INVALID_SESSION), m_tmpOutBufSize(0), m_callback(cb) : m_tmpOutBufSize(0), m_callback(cb)
{ {
} }
@@ -37,9 +37,9 @@ SenderThread::~SenderThread()
} }
void void
SenderThread::Send(SessionId session, boost::shared_ptr<NetPacket> packet) SenderThread::Send(boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet)
{ {
if (packet.get() && session != INVALID_SESSION) if (packet.get() && session.get())
{ {
boost::mutex::scoped_lock lock(m_outBufMutex); boost::mutex::scoped_lock lock(m_outBufMutex);
InternalStore(m_outBuf, SEND_QUEUE_SIZE, session, packet); InternalStore(m_outBuf, SEND_QUEUE_SIZE, session, packet);
@@ -47,9 +47,9 @@ SenderThread::Send(SessionId session, boost::shared_ptr<NetPacket> packet)
} }
void void
SenderThread::Send(SessionId session, const NetPacketList &packetList) SenderThread::Send(boost::shared_ptr<SessionData> session, const NetPacketList &packetList)
{ {
if (!packetList.empty() && session != INVALID_SESSION) if (!packetList.empty() && session.get())
{ {
boost::mutex::scoped_lock lock(m_outBufMutex); boost::mutex::scoped_lock lock(m_outBufMutex);
InternalStore(m_outBuf, SEND_QUEUE_SIZE, session, packetList); InternalStore(m_outBuf, SEND_QUEUE_SIZE, session, packetList);
@@ -57,9 +57,9 @@ SenderThread::Send(SessionId session, const NetPacketList &packetList)
} }
void void
SenderThread::SendLowPrio(SessionId session, boost::shared_ptr<NetPacket> packet) SenderThread::SendLowPrio(boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet)
{ {
if (packet.get() && session != INVALID_SESSION) if (packet.get() && session.get())
{ {
boost::mutex::scoped_lock lock(m_lowPrioOutBufMutex); boost::mutex::scoped_lock lock(m_lowPrioOutBufMutex);
InternalStore(m_lowPrioOutBuf, SEND_LOW_PRIO_QUEUE_SIZE, session, packet); InternalStore(m_lowPrioOutBuf, SEND_LOW_PRIO_QUEUE_SIZE, session, packet);
@@ -67,9 +67,9 @@ SenderThread::SendLowPrio(SessionId session, boost::shared_ptr<NetPacket> packet
} }
void void
SenderThread::SendLowPrio(SessionId session, const NetPacketList &packetList) SenderThread::SendLowPrio(boost::shared_ptr<SessionData> session, const NetPacketList &packetList)
{ {
if (!packetList.empty() && session != INVALID_SESSION) if (!packetList.empty() && session.get())
{ {
boost::mutex::scoped_lock lock(m_lowPrioOutBufMutex); boost::mutex::scoped_lock lock(m_lowPrioOutBufMutex);
InternalStore(m_lowPrioOutBuf, SEND_LOW_PRIO_QUEUE_SIZE, session, packetList); InternalStore(m_lowPrioOutBuf, SEND_LOW_PRIO_QUEUE_SIZE, session, packetList);
@@ -77,7 +77,7 @@ SenderThread::SendLowPrio(SessionId session, const NetPacketList &packetList)
} }
void void
SenderThread::InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, SessionId session, boost::shared_ptr<NetPacket> packet) SenderThread::InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet)
{ {
if (sendQueue.size() < maxQueueSize) // Queue is limited in size. if (sendQueue.size() < maxQueueSize) // Queue is limited in size.
sendQueue.push_back(std::make_pair(packet, session)); sendQueue.push_back(std::make_pair(packet, session));
@@ -85,7 +85,7 @@ SenderThread::InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, Ses
} }
void void
SenderThread::InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, SessionId session, const NetPacketList &packetList) SenderThread::InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, boost::shared_ptr<SessionData> session, const NetPacketList &packetList)
{ {
if (sendQueue.size() + packetList.size() < maxQueueSize) if (sendQueue.size() + packetList.size() < maxQueueSize)
{ {
@@ -134,7 +134,7 @@ SenderThread::Main()
if (tmpData.first.get()) if (tmpData.first.get())
{ {
if (tmpData.second != INVALID_SESSION) if (tmpData.second.get())
m_curSession = tmpData.second; m_curSession = tmpData.second;
u_int16_t tmpLen = tmpData.first->GetLen(); u_int16_t tmpLen = tmpData.first->GetLen();
@@ -147,15 +147,7 @@ SenderThread::Main()
} }
if (m_tmpOutBufSize) if (m_tmpOutBufSize)
{ {
SOCKET tmpSocket; SOCKET tmpSocket = m_curSession->GetSocket();
if (!m_callback.GetSocketForSession(m_curSession, tmpSocket))
{
// Invalid session - skip.
m_tmpOutBufSize = 0;
m_curSession = INVALID_SESSION;
}
else
{
fd_set writeSet; fd_set writeSet;
struct timeval timeout; struct timeval timeout;
@@ -174,9 +166,9 @@ SenderThread::Main()
// Skip this packet - this is bad, and is therefore reported. // Skip this packet - this is bad, and is therefore reported.
// Ignore invalid or not connected sockets. // Ignore invalid or not connected sockets.
if (errCode != SOCKET_ERR_NOTCONN && errCode != SOCKET_ERR_NOTSOCK) if (errCode != SOCKET_ERR_NOTCONN && errCode != SOCKET_ERR_NOTSOCK)
m_callback.SignalNetError(m_curSession, ERR_SOCK_SELECT_FAILED, errCode); m_callback.SignalNetError(m_curSession->GetId(), ERR_SOCK_SELECT_FAILED, errCode);
m_tmpOutBufSize = 0; m_tmpOutBufSize = 0;
m_curSession = INVALID_SESSION; m_curSession.reset();
} }
Msleep(SEND_TIMEOUT_MSEC); Msleep(SEND_TIMEOUT_MSEC);
} }
@@ -194,9 +186,9 @@ SenderThread::Main()
// Skip this packet - this is bad, and is therefore reported. // Skip this packet - this is bad, and is therefore reported.
// Ignore invalid or not connected sockets. // Ignore invalid or not connected sockets.
if (errCode != SOCKET_ERR_NOTCONN && errCode != SOCKET_ERR_NOTSOCK) if (errCode != SOCKET_ERR_NOTCONN && errCode != SOCKET_ERR_NOTSOCK)
m_callback.SignalNetError(m_curSession, ERR_SOCK_SEND_FAILED, errCode); m_callback.SignalNetError(m_curSession->GetId(), ERR_SOCK_SEND_FAILED, errCode);
m_tmpOutBufSize = 0; m_tmpOutBufSize = 0;
m_curSession = INVALID_SESSION; m_curSession.reset();
} }
Msleep(SEND_TIMEOUT_MSEC); Msleep(SEND_TIMEOUT_MSEC);
} }
@@ -208,8 +200,7 @@ SenderThread::Main()
else else
{ {
m_tmpOutBufSize = 0; m_tmpOutBufSize = 0;
m_curSession = INVALID_SESSION; m_curSession.reset();
}
} }
} }
} }
+4 -4
View File
@@ -271,7 +271,7 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s
joinGameAckData.prights = session.playerData->GetRights(); joinGameAckData.prights = session.playerData->GetRights();
joinGameAckData.gameData = server.GetGameData(); joinGameAckData.gameData = server.GetGameData();
static_cast<NetPacketJoinGameAck *>(joinGameAck.get())->SetData(joinGameAckData); static_cast<NetPacketJoinGameAck *>(joinGameAck.get())->SetData(joinGameAckData);
server.GetSender().Send(session.sessionData->GetId(), joinGameAck); server.GetSender().Send(session.sessionData, joinGameAck);
// Send notifications for connected players to client. // Send notifications for connected players to client.
PlayerDataList tmpPlayerList = server.GetFullPlayerDataList(); PlayerDataList tmpPlayerList = server.GetFullPlayerDataList();
@@ -279,7 +279,7 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s
PlayerDataList::iterator player_end = tmpPlayerList.end(); PlayerDataList::iterator player_end = tmpPlayerList.end();
while (player_i != player_end) while (player_i != player_end)
{ {
server.GetSender().Send(session.sessionData->GetId(), CreateNetPacketPlayerJoined(*(*player_i))); server.GetSender().Send(session.sessionData, CreateNetPacketPlayerJoined(*(*player_i)));
++player_i; ++player_i;
} }
@@ -538,7 +538,7 @@ ServerGameStateStartHand::Process(ServerGameThread &server)
handStartData.smallBlind = curGame.getCurrentHand()->getSmallBlind(); handStartData.smallBlind = curGame.getCurrentHand()->getSmallBlind();
static_cast<NetPacketHandStart *>(notifyCards.get())->SetData(handStartData); static_cast<NetPacketHandStart *>(notifyCards.get())->SetData(handStartData);
server.GetSender().Send(tmpPlayer->getNetSessionData()->GetId(), notifyCards); server.GetSender().Send(tmpPlayer->getNetSessionData(), notifyCards);
} }
++i; ++i;
} }
@@ -908,7 +908,7 @@ ServerGameStateWaitPlayerAction::InternalProcess(ServerGameThread &server, Sessi
rejectData.playerBet = actionData.playerBet; rejectData.playerBet = actionData.playerBet;
rejectData.rejectionReason = code; rejectData.rejectionReason = code;
static_cast<NetPacketPlayersActionRejected *>(reject.get())->SetData(rejectData); static_cast<NetPacketPlayersActionRejected *>(reject.get())->SetData(rejectData);
server.GetSender().Send(session.sessionData->GetId(), reject); server.GetSender().Send(session.sessionData, reject);
} }
} }
-4
View File
@@ -40,10 +40,6 @@ public:
GameSenderCallback(ServerGameThread &server) : m_server(server) {} GameSenderCallback(ServerGameThread &server) : m_server(server) {}
virtual ~GameSenderCallback() {} virtual ~GameSenderCallback() {}
virtual bool GetSocketForSession(SessionId session, SOCKET &outSocket)
{
return m_server.GetSessionManager().GetSocketForSession(session, outSocket);
}
virtual void SignalNetError(SessionId /*session*/, int /*errorID*/, int /*osErrorID*/) virtual void SignalNetError(SessionId /*session*/, int /*errorID*/, int /*osErrorID*/)
{ {
// We just ignore send errors for now, on server side. // We just ignore send errors for now, on server side.
+20 -28
View File
@@ -46,10 +46,6 @@ public:
ServerSenderCallback(ServerLobbyThread &server) : m_server(server) {} ServerSenderCallback(ServerLobbyThread &server) : m_server(server) {}
virtual ~ServerSenderCallback() {} virtual ~ServerSenderCallback() {}
virtual bool GetSocketForSession(SessionId session, SOCKET &outSocket)
{
return m_server.GetSocketForSession(session, outSocket);
}
virtual void SignalNetError(SessionId /*session*/, int /*errorID*/, int /*osErrorID*/) virtual void SignalNetError(SessionId /*session*/, int /*errorID*/, int /*osErrorID*/)
{ {
// We just ignore send errors for now, on server side. // We just ignore send errors for now, on server side.
@@ -97,7 +93,7 @@ ServerLobbyThread::ReAddSession(SessionWrapper session, int reason)
NetPacketRemovedFromGame::Data removedData; NetPacketRemovedFromGame::Data removedData;
removedData.removeReason = reason; removedData.removeReason = reason;
static_cast<NetPacketRemovedFromGame *>(packet.get())->SetData(removedData); static_cast<NetPacketRemovedFromGame *>(packet.get())->SetData(removedData);
GetSender().Send(session.sessionData->GetId(), packet); GetSender().Send(session.sessionData, packet);
boost::mutex::scoped_lock lock(m_sessionQueueMutex); boost::mutex::scoped_lock lock(m_sessionQueueMutex);
m_sessionQueue.push_back(session); m_sessionQueue.push_back(session);
@@ -120,7 +116,9 @@ void
ServerLobbyThread::RemoveSessionFromGame(SessionWrapper session) ServerLobbyThread::RemoveSessionFromGame(SessionWrapper session)
{ {
// Just remove the session. Only for fatal errors. // Just remove the session. Only for fatal errors.
CloseSessionDelayed(session); m_gameSessionManager.RemoveSession(session.sessionData->GetId());
// Update stats (if needed).
BroadcastStatisticsUpdate();
} }
void void
@@ -230,15 +228,6 @@ ServerLobbyThread::RemoveGame(unsigned id)
m_removeGameList.push_back(id); m_removeGameList.push_back(id);
} }
bool
ServerLobbyThread::GetSocketForSession(SessionId session, SOCKET &outSocket)
{
bool retVal = m_sessionManager.GetSocketForSession(session, outSocket);
if (!retVal)
retVal = m_gameSessionManager.GetSocketForSession(session, outSocket);
return retVal;
}
AvatarManager & AvatarManager &
ServerLobbyThread::GetAvatarManager() ServerLobbyThread::GetAvatarManager()
{ {
@@ -310,7 +299,10 @@ ServerLobbyThread::ProcessLoop()
} catch (const NetException &) } catch (const NetException &)
{ {
// On error: Close this session. // On error: Close this session.
CloseSessionDelayed(session); m_initTimerSessionMap.erase(session.sessionData->GetId());
m_sessionManager.RemoveSession(session.sessionData->GetId());
// Update stats (if needed).
BroadcastStatisticsUpdate();
return; return;
} }
if (packet.get()) if (packet.get())
@@ -519,7 +511,7 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
if (infoData.playerInfo.hasAvatar) if (infoData.playerInfo.hasAvatar)
infoData.playerInfo.avatar = tmpPlayer->GetAvatarMD5(); infoData.playerInfo.avatar = tmpPlayer->GetAvatarMD5();
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData); static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
GetSender().Send(session.sessionData->GetId(), info); GetSender().Send(session.sessionData, info);
} }
else else
{ {
@@ -528,7 +520,7 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
NetPacketUnknownPlayerId::Data unknownData; NetPacketUnknownPlayerId::Data unknownData;
unknownData.playerId = request.playerId; unknownData.playerId = request.playerId;
static_cast<NetPacketUnknownPlayerId *>(unknown.get())->SetData(unknownData); static_cast<NetPacketUnknownPlayerId *>(unknown.get())->SetData(unknownData);
GetSender().Send(session.sessionData->GetId(), unknown); GetSender().Send(session.sessionData, unknown);
} }
} }
@@ -546,7 +538,7 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N
if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets) == 0) if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets) == 0)
{ {
avatarFound = true; avatarFound = true;
GetSender().SendLowPrio(session.sessionData->GetId(), tmpPackets); GetSender().SendLowPrio(session.sessionData, tmpPackets);
} }
else else
LOG_ERROR("Failed to read avatar file for network transmission."); LOG_ERROR("Failed to read avatar file for network transmission.");
@@ -559,7 +551,7 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N
NetPacketUnknownAvatar::Data unknownData; NetPacketUnknownAvatar::Data unknownData;
unknownData.requestId = request.requestId; unknownData.requestId = request.requestId;
static_cast<NetPacketUnknownAvatar *>(unknown.get())->SetData(unknownData); static_cast<NetPacketUnknownAvatar *>(unknown.get())->SetData(unknownData);
GetSender().Send(session.sessionData->GetId(), unknown); GetSender().Send(session.sessionData, unknown);
} }
} }
@@ -608,7 +600,7 @@ ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const NetPack
} }
else else
{ {
SendJoinGameFailed(session.sessionData->GetId(), NTF_NET_JOIN_INVALID_PASSWORD); SendJoinGameFailed(session.sessionData, NTF_NET_JOIN_INVALID_PASSWORD);
} }
} }
else else
@@ -629,10 +621,10 @@ ServerLobbyThread::EstablishSession(SessionWrapper session)
initAckData.sessionId = session.sessionData->GetId(); // TODO: currently unused. initAckData.sessionId = session.sessionData->GetId(); // TODO: currently unused.
initAckData.playerId = session.playerData->GetUniqueId(); initAckData.playerId = session.playerData->GetUniqueId();
static_cast<NetPacketInitAck *>(initAck.get())->SetData(initAckData); static_cast<NetPacketInitAck *>(initAck.get())->SetData(initAckData);
GetSender().Send(session.sessionData->GetId(), initAck); GetSender().Send(session.sessionData, initAck);
// Send the game list to the client. // Send the game list to the client.
SendGameList(session.sessionData->GetId()); SendGameList(session.sessionData);
// Session is now established. // Session is now established.
m_initTimerSessionMap.erase(session.sessionData->GetId()); m_initTimerSessionMap.erase(session.sessionData->GetId());
@@ -653,7 +645,7 @@ ServerLobbyThread::RequestPlayerAvatar(SessionWrapper session)
retrieveAvatarData.requestId = session.playerData->GetUniqueId(); retrieveAvatarData.requestId = session.playerData->GetUniqueId();
retrieveAvatarData.avatar = session.playerData->GetAvatarMD5(); retrieveAvatarData.avatar = session.playerData->GetAvatarMD5();
static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData); static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData);
GetSender().Send(session.sessionData->GetId(), retrieveAvatar); GetSender().Send(session.sessionData, retrieveAvatar);
} }
void void
@@ -867,13 +859,13 @@ ServerLobbyThread::SessionError(SessionWrapper session, int errorCode)
{ {
if (session.sessionData.get()) if (session.sessionData.get())
{ {
SendError(session.sessionData->GetId(), errorCode); SendError(session.sessionData, errorCode);
CloseSessionDelayed(session); CloseSessionDelayed(session);
} }
} }
void void
ServerLobbyThread::SendError(SessionId s, int errorCode) ServerLobbyThread::SendError(boost::shared_ptr<SessionData> s, int errorCode)
{ {
boost::shared_ptr<NetPacket> packet(new NetPacketError); boost::shared_ptr<NetPacket> packet(new NetPacketError);
NetPacketError::Data errorData; NetPacketError::Data errorData;
@@ -883,7 +875,7 @@ ServerLobbyThread::SendError(SessionId s, int errorCode)
} }
void void
ServerLobbyThread::SendJoinGameFailed(SessionId s, int reason) ServerLobbyThread::SendJoinGameFailed(boost::shared_ptr<SessionData> s, int reason)
{ {
boost::shared_ptr<NetPacket> packet(new NetPacketJoinGameFailed); boost::shared_ptr<NetPacket> packet(new NetPacketJoinGameFailed);
NetPacketJoinGameFailed::Data failedData; NetPacketJoinGameFailed::Data failedData;
@@ -893,7 +885,7 @@ ServerLobbyThread::SendJoinGameFailed(SessionId s, int reason)
} }
void void
ServerLobbyThread::SendGameList(SessionId s) ServerLobbyThread::SendGameList(boost::shared_ptr<SessionData> s)
{ {
GameMap::const_iterator game_i = m_gameMap.begin(); GameMap::const_iterator game_i = m_gameMap.begin();
GameMap::const_iterator game_end = m_gameMap.end(); GameMap::const_iterator game_end = m_gameMap.end();
+2 -17
View File
@@ -206,21 +206,6 @@ SessionManager::GetSessionByUniquePlayerId(unsigned uniqueId) const
return tmpSession; return tmpSession;
} }
bool
SessionManager::GetSocketForSession(SessionId session, SOCKET &outSocket)
{
bool retVal = false;
boost::mutex::scoped_lock lock(m_sessionMapMutex);
SessionMap::iterator pos = m_sessionMap.find(session);
if (pos != m_sessionMap.end())
{
outSocket = pos->second.sessionData->GetSocket();
retVal = true;
}
return retVal;
}
PlayerDataList PlayerDataList
SessionManager::GetPlayerDataList() const SessionManager::GetPlayerDataList() const
{ {
@@ -370,7 +355,7 @@ SessionManager::SendToAllSessions(SenderThread &sender, boost::shared_ptr<NetPac
// Send each client (with a certain state) a copy of the packet. // Send each client (with a certain state) a copy of the packet.
if (i->second.sessionData->GetState() == state) if (i->second.sessionData->GetState() == state)
sender.Send(i->first, boost::shared_ptr<NetPacket>(packet->Clone())); sender.Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
++i; ++i;
} }
} }
@@ -388,7 +373,7 @@ SessionManager::SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr<
// Send each fully connected client but one a copy of the packet. // Send each fully connected client but one a copy of the packet.
if (i->second.sessionData->GetState() == state) if (i->second.sessionData->GetState() == state)
if (i->first != except) if (i->first != except)
sender.Send(i->first, boost::shared_ptr<NetPacket>(packet->Clone())); sender.Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
++i; ++i;
} }
} }
-1
View File
@@ -29,7 +29,6 @@ class SenderCallback
public: public:
virtual ~SenderCallback(); virtual ~SenderCallback();
virtual bool GetSocketForSession(SessionId session, SOCKET &outSocket) = 0;
virtual void SignalNetError(SessionId session, int errorID, int osErrorID) = 0; virtual void SignalNetError(SessionId session, int errorID, int osErrorID) = 0;
}; };
+8 -8
View File
@@ -41,25 +41,25 @@ public:
SenderThread(SenderCallback &cb); SenderThread(SenderCallback &cb);
virtual ~SenderThread(); virtual ~SenderThread();
void Send(SessionId session, boost::shared_ptr<NetPacket> packet); void Send(boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
void Send(SessionId session, const NetPacketList &packetList); void Send(boost::shared_ptr<SessionData> session, const NetPacketList &packetList);
void SendLowPrio(SessionId session, boost::shared_ptr<NetPacket> packet); void SendLowPrio(boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
void SendLowPrio(SessionId session, const NetPacketList &packetList); void SendLowPrio(boost::shared_ptr<SessionData> session, const NetPacketList &packetList);
protected: protected:
typedef std::pair<boost::shared_ptr<NetPacket>, SessionId> SendData; typedef std::pair<boost::shared_ptr<NetPacket>, boost::shared_ptr<SessionData> > SendData;
typedef std::deque<SendData> SendDataDeque; typedef std::deque<SendData> SendDataDeque;
// Main function of the thread. // Main function of the thread.
virtual void Main(); virtual void Main();
void InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, SessionId session, boost::shared_ptr<NetPacket> packet); void InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
void InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, SessionId session, const NetPacketList &packetList); void InternalStore(SendDataDeque &sendQueue, unsigned maxQueueSize, boost::shared_ptr<SessionData> session, const NetPacketList &packetList);
private: private:
SessionId m_curSession; boost::shared_ptr<SessionData> m_curSession;
std::deque<SendData> m_outBuf; std::deque<SendData> m_outBuf;
mutable boost::mutex m_outBufMutex; mutable boost::mutex m_outBufMutex;
+3 -5
View File
@@ -70,8 +70,6 @@ public:
void RemoveGame(unsigned id); void RemoveGame(unsigned id);
bool GetSocketForSession(SessionId session, SOCKET &outSocket);
u_int32_t GetNextUniquePlayerId(); u_int32_t GetNextUniquePlayerId();
u_int32_t GetNextGameId(); u_int32_t GetNextGameId();
ServerCallback &GetCallback(); ServerCallback &GetCallback();
@@ -123,9 +121,9 @@ protected:
void CleanupSessionMap(); void CleanupSessionMap();
void CloseSessionDelayed(SessionWrapper session); void CloseSessionDelayed(SessionWrapper session);
void SendError(SessionId s, int errorCode); void SendError(boost::shared_ptr<SessionData> s, int errorCode);
void SendJoinGameFailed(SessionId s, int reason); void SendJoinGameFailed(boost::shared_ptr<SessionData> s, int reason);
void SendGameList(SessionId s); void SendGameList(boost::shared_ptr<SessionData> s);
void BroadcastStatisticsUpdate(); void BroadcastStatisticsUpdate();
SenderThread &GetSender(); SenderThread &GetSender();