Adding websocket server code, so that a gateway is no longer required. Still kind of untested. Requires websocketpp.

This commit is contained in:
lotodore
2013-09-15 22:54:45 +02:00
parent b0e4018883
commit 8e39432754
19 changed files with 175 additions and 376 deletions
+47 -38
View File
@@ -267,10 +267,9 @@ ServerLobbyThread::SignalTermination()
}
void
ServerLobbyThread::AddConnection(boost::shared_ptr<tcp::socket> sock)
ServerLobbyThread::AddConnection(boost::shared_ptr<SessionData> sessionData)
{
// Create a new session.
boost::shared_ptr<SessionData> sessionData(new SessionData(sock, m_curSessionId++, *m_internalServerCallback, GetIOService()));
m_sessionManager.AddSession(sessionData);
LOG_VERBOSE("Accepted connection - session #" << sessionData->GetId() << ".");
@@ -284,42 +283,37 @@ ServerLobbyThread::AddConnection(boost::shared_ptr<tcp::socket> sock)
if (numLobbySessions <= SERVER_MAX_NUM_LOBBY_SESSIONS
&& numLobbySessions + numGameSessions <= SERVER_MAX_NUM_TOTAL_SESSIONS) {
bool hasClientIp = false;
boost::system::error_code errCode;
tcp::endpoint clientEndpoint = sock->remote_endpoint(errCode);
if (!errCode) {
string ipAddress = clientEndpoint.address().to_string(errCode);
if (!errCode && !ipAddress.empty()) {
sessionData->SetClientAddr(ipAddress);
hasClientIp = true;
string ipAddress = sessionData->GetRemoteIPAddressFromSocket();
if (!ipAddress.empty()) {
sessionData->SetClientAddr(ipAddress);
hasClientIp = true;
boost::shared_ptr<NetPacket> packet(new NetPacket);
packet->GetMsg()->set_messagetype(PokerTHMessage::Type_AnnounceMessage);
AnnounceMessage *netAnnounce = packet->GetMsg()->mutable_announcemessage();
netAnnounce->mutable_protocolversion()->set_majorversion(NET_VERSION_MAJOR);
netAnnounce->mutable_protocolversion()->set_minorversion(NET_VERSION_MINOR);
netAnnounce->mutable_latestgameversion()->set_majorversion(POKERTH_VERSION_MAJOR);
netAnnounce->mutable_latestgameversion()->set_minorversion(POKERTH_VERSION_MINOR);
netAnnounce->set_latestbetarevision(POKERTH_BETA_REVISION);
switch (GetServerMode()) {
case SERVER_MODE_LAN:
netAnnounce->set_servertype(AnnounceMessage::serverTypeLAN);
break;
case SERVER_MODE_INTERNET_NOAUTH:
netAnnounce->set_servertype(AnnounceMessage::serverTypeInternetNoAuth);
break;
case SERVER_MODE_INTERNET_AUTH:
netAnnounce->set_servertype(AnnounceMessage::serverTypeInternetAuth);
break;
}
{
boost::mutex::scoped_lock lock(m_statMutex);
netAnnounce->set_numplayersonserver(m_statData.numberOfPlayersOnServer);
}
GetSender().Send(sessionData, packet);
sessionData->GetReceiveBuffer().StartAsyncRead(sessionData);
boost::shared_ptr<NetPacket> packet(new NetPacket);
packet->GetMsg()->set_messagetype(PokerTHMessage::Type_AnnounceMessage);
AnnounceMessage *netAnnounce = packet->GetMsg()->mutable_announcemessage();
netAnnounce->mutable_protocolversion()->set_majorversion(NET_VERSION_MAJOR);
netAnnounce->mutable_protocolversion()->set_minorversion(NET_VERSION_MINOR);
netAnnounce->mutable_latestgameversion()->set_majorversion(POKERTH_VERSION_MAJOR);
netAnnounce->mutable_latestgameversion()->set_minorversion(POKERTH_VERSION_MINOR);
netAnnounce->set_latestbetarevision(POKERTH_BETA_REVISION);
switch (GetServerMode()) {
case SERVER_MODE_LAN:
netAnnounce->set_servertype(AnnounceMessage::serverTypeLAN);
break;
case SERVER_MODE_INTERNET_NOAUTH:
netAnnounce->set_servertype(AnnounceMessage::serverTypeInternetNoAuth);
break;
case SERVER_MODE_INTERNET_AUTH:
netAnnounce->set_servertype(AnnounceMessage::serverTypeInternetAuth);
break;
}
}
if (!hasClientIp) {
{
boost::mutex::scoped_lock lock(m_statMutex);
netAnnounce->set_numplayersonserver(m_statData.numberOfPlayersOnServer);
}
GetSender().Send(sessionData, packet);
sessionData->GetReceiveBuffer().StartAsyncRead(sessionData);
} else {
// We do not accept sessions if we cannot
// retrieve the client address.
SessionError(sessionData, ERR_NET_INVALID_SESSION);
@@ -406,8 +400,11 @@ ServerLobbyThread::CloseSession(boost::shared_ptr<SessionData> session)
UpdateStatisticsNumberOfPlayers();
// Ignore error when shutting down the socket.
boost::system::error_code ec;
session->GetAsioSocket()->shutdown(boost::asio::ip::tcp::socket::shutdown_receive, ec);
boost::shared_ptr<boost::asio::ip::tcp::socket> sock = session->GetAsioSocket();
if (sock) {
boost::system::error_code ec;
session->GetAsioSocket()->shutdown(boost::asio::ip::tcp::socket::shutdown_receive, ec);
}
// Close this session after send.
GetSender().SetCloseAfterSend(session);
// Cancel all timers of the session.
@@ -789,6 +786,18 @@ ServerLobbyThread::GetBanManager()
return *m_banManager;
}
SessionDataCallback &
ServerLobbyThread::GetSessionDataCallback()
{
return *m_internalServerCallback;
}
u_int32_t
ServerLobbyThread::GetNextSessionId()
{
return m_curSessionId++;
}
u_int32_t
ServerLobbyThread::GetNextUniquePlayerId()
{