1
0
forked from 0ad/0ad

Network cleanup, fixes #3953.

Don't compare for "127.0.0.1" to identify the host, but check for a new
boolean flag that is set by the client, refs #2854.
Remove an unneeded IP address conversion from u32 to string, refs #3241.

This was SVN commit r18140.
This commit is contained in:
elexis 2016-05-08 11:46:19 +00:00
parent cc3d7d58ea
commit 1a3fb29ff3
10 changed files with 64 additions and 48 deletions

View File

@ -359,7 +359,7 @@ void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring
}
g_Game = new CGame();
g_NetClient = new CNetClient(g_Game);
g_NetClient = new CNetClient(g_Game, true);
g_NetClient->SetUserName(playerName);
if (!g_NetClient->SetupConnection("127.0.0.1"))
@ -377,7 +377,7 @@ void StartNetworkJoin(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring
ENSURE(!g_Game);
g_Game = new CGame();
g_NetClient = new CNetClient(g_Game);
g_NetClient = new CNetClient(g_Game, false);
g_NetClient->SetUserName(playerName);
if (!g_NetClient->SetupConnection(serverAddress))
{

View File

@ -66,11 +66,12 @@ private:
CNetClient& m_Client;
};
CNetClient::CNetClient(CGame* game) :
CNetClient::CNetClient(CGame* game, bool isLocalClient) :
m_Session(NULL),
m_UserName(L"anonymous"),
m_GUID(ps_generate_guid()), m_HostID((u32)-1), m_ClientTurnManager(NULL), m_Game(game),
m_GameAttributes(game->GetSimulation2()->GetScriptInterface().GetContext()),
m_IsLocalClient(isLocalClient),
m_LastConnectionCheck(0)
{
m_Game->SetTurnManager(NULL); // delete the old local turn manager so we don't accidentally use it
@ -154,7 +155,7 @@ void CNetClient::SetUserName(const CStrW& username)
bool CNetClient::SetupConnection(const CStr& server)
{
CNetClientSession* session = new CNetClientSession(*this);
bool ok = session->Connect(PS_DEFAULT_PORT, server);
bool ok = session->Connect(PS_DEFAULT_PORT, server, m_IsLocalClient);
SetAndOwnSession(session);
return ok;
}
@ -467,6 +468,7 @@ bool CNetClient::OnHandshakeResponse(void* context, CFsmEvent* event)
authenticate.m_GUID = client->m_GUID;
authenticate.m_Name = client->m_UserName;
authenticate.m_Password = L""; // TODO
authenticate.m_IsLocalClient = client->m_IsLocalClient;
client->SendMessage(&authenticate);
return true;

View File

@ -65,7 +65,7 @@ public:
* Construct a client associated with the given game object.
* The game must exist for the lifetime of this object.
*/
CNetClient(CGame* game);
CNetClient(CGame* game, bool isLocalClient);
virtual ~CNetClient();
@ -239,6 +239,9 @@ private:
/// Unique-per-game identifier of this client, used to identify the sender of simulation commands
u32 m_HostID;
/// Whether to prevent the client of the host from timing out
bool m_IsLocalClient;
/// Latest copy of game setup attributes heard from the server
JS::PersistentRootedValue m_GameAttributes;

View File

@ -28,7 +28,7 @@
#define PS_PROTOCOL_MAGIC 0x5073013f // 'P', 's', 0x01, '?'
#define PS_PROTOCOL_MAGIC_RESPONSE 0x50630121 // 'P', 'c', 0x01, '!'
#define PS_PROTOCOL_VERSION 0x01010011 // Arbitrary protocol
#define PS_PROTOCOL_VERSION 0x01010012 // Arbitrary protocol
#define PS_DEFAULT_PORT 0x5073 // 'P', 's'
// Defines the list of message types. The order of the list must not change.
@ -112,6 +112,7 @@ START_NMT_CLASS_(Authenticate, NMT_AUTHENTICATE)
NMT_FIELD(CStr8, m_GUID)
NMT_FIELD(CStrW, m_Name)
NMT_FIELD(CStrW, m_Password)
NMT_FIELD_INT(m_IsLocalClient, u8, 1)
END_NMT_CLASS()
START_NMT_CLASS_(AuthenticateResult, NMT_AUTHENTICATE_RESULT)

View File

@ -25,7 +25,6 @@
#include "NetStats.h"
#include "NetTurnManager.h"
#include "lib/external_libraries/enet.h"
#include "ps/CLogger.h"
#include "ps/ConfigDB.h"
#include "scriptinterface/ScriptInterface.h"
@ -486,12 +485,6 @@ bool CNetServerWorker::RunStep()
CNetServerSession* session = new CNetServerSession(*this, event.peer);
// Prevent the local client of the host from timing out too quickly
#if (ENET_VERSION >= ENET_VERSION_CREATE(1, 3, 4))
if (session->GetIPAddress() == "127.0.0.1")
enet_peer_timeout(event.peer, 0, MAXIMUM_HOST_TIMEOUT, MAXIMUM_HOST_TIMEOUT);
#endif
m_Sessions.push_back(session);
SetupSession(session);
@ -690,7 +683,7 @@ void CNetServerWorker::OnUserJoin(CNetServerSession* session)
{
AddPlayer(session->GetGUID(), session->GetUserName());
if (m_HostGUID.empty() && session->GetIPAddress() == "127.0.0.1")
if (m_HostGUID.empty() && session->IsLocalClient())
m_HostGUID = session->GetGUID();
CGameSetupMessage gameSetupMessage(GetScriptInterface());
@ -802,8 +795,8 @@ bool CNetServerWorker::KickPlayer(const CStrW& playerName, const bool ban)
m_BannedPlayers.push_back(playerName);
// Remember IP address
CStr ipAddress = (*it)->GetIPAddress();
if (!ipAddress.empty() && std::find(m_BannedIPs.begin(), m_BannedIPs.end(), ipAddress) == m_BannedIPs.end())
enet_uint32 ipAddress = (*it)->GetIPAddress();
if (std::find(m_BannedIPs.begin(), m_BannedIPs.end(), ipAddress) == m_BannedIPs.end())
m_BannedIPs.push_back(ipAddress);
}
@ -999,6 +992,7 @@ bool CNetServerWorker::OnAuthenticate(void* context, CFsmEvent* event)
session->SetUserName(username);
session->SetGUID(message->m_GUID);
session->SetHostID(newHostID);
session->SetLocalClient(message->m_IsLocalClient);
CAuthenticateResultMessage authenticateResult;
authenticateResult.m_Code = isRejoining ? ARC_OK_REJOINING : ARC_OK;

View File

@ -22,6 +22,7 @@
#include "NetHost.h"
#include "lib/config2.h"
#include "lib/external_libraries/enet.h"
#include "ps/ThreadUtil.h"
#include "scriptinterface/ScriptVal.h"
@ -313,7 +314,7 @@ private:
CStrW m_ServerName;
CStrW m_WelcomeMessage;
std::vector<CStr> m_BannedIPs;
std::vector<enet_uint32> m_BannedIPs;
std::vector<CStrW> m_BannedPlayers;
u32 m_NextHostID;

View File

@ -21,7 +21,6 @@
#include "NetServer.h"
#include "NetMessage.h"
#include "NetStats.h"
#include "lib/external_libraries/enet.h"
#include "ps/CLogger.h"
#include "scriptinterface/ScriptInterface.h"
@ -51,7 +50,7 @@ CNetClientSession::~CNetClientSession()
}
}
bool CNetClientSession::Connect(u16 port, const CStr& server)
bool CNetClientSession::Connect(u16 port, const CStr& server, bool isLocalClient)
{
ENSURE(!m_Host);
ENSURE(!m_Server);
@ -77,7 +76,7 @@ bool CNetClientSession::Connect(u16 port, const CStr& server)
// Prevent the local client of the host from timing out too quickly.
#if (ENET_VERSION >= ENET_VERSION_CREATE(1, 3, 4))
if (GetIPAddress() == "127.0.0.1")
if (isLocalClient)
enet_peer_timeout(peer, 1, MAXIMUM_HOST_TIMEOUT, MAXIMUM_HOST_TIMEOUT);
#endif
@ -178,15 +177,6 @@ bool CNetClientSession::SendMessage(const CNetMessage* message)
return CNetHost::SendMessage(message, m_Server, "server");
}
CStr CNetClientSession::GetIPAddress() const
{
char ipAddress[256] = "";
if (enet_address_get_host_ip(&m_Server->address, ipAddress, ARRAY_SIZE(ipAddress)) < 0)
LOGMESSAGE("Could not get IP address of the server!");
return ipAddress;
}
u32 CNetClientSession::GetLastReceivedTime() const
{
if (!m_Server)
@ -210,13 +200,9 @@ CNetServerSession::CNetServerSession(CNetServerWorker& server, ENetPeer* peer) :
{
}
CStr CNetServerSession::GetIPAddress() const
enet_uint32 CNetServerSession::GetIPAddress() const
{
char ipAddress[256] = "";
if (enet_address_get_host_ip(&m_Peer->address, ipAddress, ARRAY_SIZE(ipAddress)) < 0)
LOGMESSAGE("Could not get IP address of a client!");
return ipAddress;
return m_Peer->address.host;
}
u32 CNetServerSession::GetLastReceivedTime() const
@ -251,3 +237,21 @@ bool CNetServerSession::SendMessage(const CNetMessage* message)
{
return m_Server.SendMessage(m_Peer, message);
}
bool CNetServerSession::IsLocalClient() const
{
return m_IsLocalClient;
}
void CNetServerSession::SetLocalClient(bool isLocalClient)
{
m_IsLocalClient = isLocalClient;
if (!isLocalClient)
return;
// Prevent the local client of the host from timing out too quickly
#if (ENET_VERSION >= ENET_VERSION_CREATE(1, 3, 4))
enet_peer_timeout(m_Peer, 0, MAXIMUM_HOST_TIMEOUT, MAXIMUM_HOST_TIMEOUT);
#endif
}

View File

@ -21,6 +21,7 @@
#include "network/fsm.h"
#include "network/NetFileTransfer.h"
#include "network/NetHost.h"
#include "lib/external_libraries/enet.h"
#include "ps/CStr.h"
#include "scriptinterface/ScriptVal.h"
@ -70,7 +71,7 @@ public:
CNetClientSession(CNetClient& client);
~CNetClientSession();
bool Connect(u16 port, const CStr& server);
bool Connect(u16 port, const CStr& server, bool isLocalClient);
/**
* Process queued incoming messages.
@ -93,8 +94,6 @@ public:
*/
virtual bool SendMessage(const CNetMessage* message);
CStr GetIPAddress() const;
/**
* Number of milliseconds since the most recent packet of the server was received.
*/
@ -144,7 +143,12 @@ public:
u32 GetHostID() const { return m_HostID; }
void SetHostID(u32 id) { m_HostID = id; }
CStr GetIPAddress() const;
enet_uint32 GetIPAddress() const;
/**
* Whether this client is running in the same process as the server.
*/
bool IsLocalClient() const;
/**
* Number of milliseconds since the latest packet of that client was received.
@ -171,6 +175,11 @@ public:
*/
void DisconnectNow(u32 reason);
/**
* Prevent timeouts for the client running in the same process as the server.
*/
void SetLocalClient(bool isLocalClient);
/**
* Send a message to the client.
*/
@ -188,6 +197,8 @@ private:
CStr m_GUID;
CStrW m_UserName;
u32 m_HostID;
bool m_IsLocalClient;
};
#endif // NETSESSION_H

View File

@ -152,9 +152,9 @@ public:
scriptInterface.Eval("({mapType:'scenario',map:'maps/scenarios/Saharan Oases',mapPath:'maps/scenarios/',thing:'example'})", &attrs);
server.UpdateGameAttributes(&attrs, scriptInterface);
CNetClient client1(&client1Game);
CNetClient client2(&client2Game);
CNetClient client3(&client3Game);
CNetClient client1(&client1Game, false);
CNetClient client2(&client2Game, false);
CNetClient client3(&client3Game, false);
clients.push_back(&client1);
clients.push_back(&client2);
@ -217,9 +217,9 @@ public:
scriptInterface.Eval("({mapType:'scenario',map:'maps/scenarios/Saharan Oases',mapPath:'maps/scenarios/',thing:'example'})", &attrs);
server.UpdateGameAttributes(&attrs, scriptInterface);
CNetClient client1(&client1Game);
CNetClient client2(&client2Game);
CNetClient client3(&client3Game);
CNetClient client1(&client1Game, false);
CNetClient client2(&client2Game, false);
CNetClient client3(&client3Game, false);
client1.SetUserName(L"alice");
client2.SetUserName(L"bob");
@ -269,7 +269,7 @@ public:
debug_printf("==== Connecting client 2B\n");
CGame client2BGame(true);
CNetClient client2B(&client2BGame);
CNetClient client2B(&client2BGame, false);
client2B.SetUserName(L"bob");
clients.push_back(&client2B);

View File

@ -1486,7 +1486,7 @@ bool Autostart(const CmdLineArgs& args)
bool ok = g_NetServer->SetupConnection();
ENSURE(ok);
g_NetClient = new CNetClient(g_Game);
g_NetClient = new CNetClient(g_Game, true);
g_NetClient->SetUserName(userName);
g_NetClient->SetupConnection("127.0.0.1");
}
@ -1494,7 +1494,7 @@ bool Autostart(const CmdLineArgs& args)
{
InitPs(true, L"page_loading.xml", &scriptInterface, mpInitData);
g_NetClient = new CNetClient(g_Game);
g_NetClient = new CNetClient(g_Game, false);
g_NetClient->SetUserName(userName);
CStr ip = args.Get("autostart-client");