Changeset View
Changeset View
Standalone View
Standalone View
source/network/NetSession.cpp
Show All 29 Lines | |||||
const u32 NETWORK_WARNING_TIMEOUT = 2000; | const u32 NETWORK_WARNING_TIMEOUT = 2000; | ||||
const u32 MAXIMUM_HOST_TIMEOUT = std::numeric_limits<u32>::max(); | const u32 MAXIMUM_HOST_TIMEOUT = std::numeric_limits<u32>::max(); | ||||
static const int CHANNEL_COUNT = 1; | static const int CHANNEL_COUNT = 1; | ||||
// Only disable long timeouts after a packet from the remote enet peer has been processed. | // Only disable long timeouts after a packet from the remote enet peer has been processed. | ||||
// Otherwise a long timeout can still be in progress when disabling it here. | // Otherwise a long timeout can still be in progress when disabling it here. | ||||
void SetEnetLongTimeout(ENetPeer* peer, bool isLocalClient, bool enabled) | void SetEnetLongTimeout(ENetPeer* peer, bool enabled) | ||||
{ | { | ||||
#if (ENET_VERSION >= ENET_VERSION_CREATE(1, 3, 4)) | #if (ENET_VERSION >= ENET_VERSION_CREATE(1, 3, 4)) | ||||
if (!peer || isLocalClient) | if (!peer) | ||||
return; | return; | ||||
if (enabled) | if (enabled) | ||||
{ | { | ||||
u32 timeout; | u32 timeout; | ||||
CFG_GET_VAL("network.gamestarttimeout", timeout); | CFG_GET_VAL("network.gamestarttimeout", timeout); | ||||
enet_peer_timeout(peer, 0, timeout, timeout); | enet_peer_timeout(peer, 0, timeout, timeout); | ||||
} | } | ||||
else | else | ||||
enet_peer_timeout(peer, 0, 0, 0); | enet_peer_timeout(peer, 0, 0, 0); | ||||
#endif | #endif | ||||
} | } | ||||
CNetClientSession::CNetClientSession(CNetClient& client) : | CNetClientSession::CNetClientSession(CNetClient& client) : | ||||
m_Client(client), m_FileTransferer(this), m_Host(nullptr), m_Server(nullptr), m_Stats(nullptr), m_IsLocalClient(false) | m_Client(client), m_FileTransferer(this), m_Host(nullptr), m_Server(nullptr), m_Stats(nullptr) | ||||
{ | { | ||||
} | } | ||||
CNetClientSession::~CNetClientSession() | CNetClientSession::~CNetClientSession() | ||||
{ | { | ||||
delete m_Stats; | delete m_Stats; | ||||
if (m_Host && m_Server) | if (m_Host && m_Server) | ||||
{ | { | ||||
// Disconnect immediately (we can't wait for acks) | // Disconnect immediately (we can't wait for acks) | ||||
enet_peer_disconnect_now(m_Server, NDR_SERVER_SHUTDOWN); | enet_peer_disconnect_now(m_Server, NDR_SERVER_SHUTDOWN); | ||||
enet_host_destroy(m_Host); | enet_host_destroy(m_Host); | ||||
m_Host = NULL; | m_Host = NULL; | ||||
m_Server = NULL; | m_Server = NULL; | ||||
} | } | ||||
} | } | ||||
bool CNetClientSession::Connect(const CStr& server, const u16 port, const bool isLocalClient, ENetHost* enetClient) | bool CNetClientSession::Connect(const CStr& server, const u16 port, ENetHost* enetClient) | ||||
{ | { | ||||
ENSURE(!m_Host); | ENSURE(!m_Host); | ||||
ENSURE(!m_Server); | ENSURE(!m_Server); | ||||
// Create ENet host | // Create ENet host | ||||
ENetHost* host; | ENetHost* host; | ||||
if (enetClient != nullptr) | if (enetClient != nullptr) | ||||
host = enetClient; | host = enetClient; | ||||
Show All 11 Lines | bool CNetClientSession::Connect(const CStr& server, const u16 port, ENetHost* enetClient) | ||||
// Initiate connection to server | // Initiate connection to server | ||||
ENetPeer* peer = enet_host_connect(host, &addr, CHANNEL_COUNT, 0); | ENetPeer* peer = enet_host_connect(host, &addr, CHANNEL_COUNT, 0); | ||||
if (!peer) | if (!peer) | ||||
return false; | return false; | ||||
m_Host = host; | m_Host = host; | ||||
m_Server = peer; | m_Server = peer; | ||||
m_IsLocalClient = isLocalClient; | |||||
// Prevent the local client of the host from timing out too quickly. | |||||
#if (ENET_VERSION >= ENET_VERSION_CREATE(1, 3, 4)) | |||||
if (isLocalClient) | |||||
enet_peer_timeout(peer, 1, MAXIMUM_HOST_TIMEOUT, MAXIMUM_HOST_TIMEOUT); | |||||
#endif | |||||
m_Stats = new CNetStatsTable(m_Server); | m_Stats = new CNetStatsTable(m_Server); | ||||
if (CProfileViewer::IsInitialised()) | if (CProfileViewer::IsInitialised()) | ||||
g_ProfileViewer.AddRootTable(m_Stats); | g_ProfileViewer.AddRootTable(m_Stats); | ||||
return true; | return true; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | u32 CNetClientSession::GetMeanRTT() const | ||||
if (!m_Server) | if (!m_Server) | ||||
return 0; | return 0; | ||||
return m_Server->roundTripTime; | return m_Server->roundTripTime; | ||||
} | } | ||||
void CNetClientSession::SetLongTimeout(bool enabled) | void CNetClientSession::SetLongTimeout(bool enabled) | ||||
{ | { | ||||
SetEnetLongTimeout(m_Server, m_IsLocalClient, enabled); | SetEnetLongTimeout(m_Server, enabled); | ||||
} | } | ||||
CNetServerSession::CNetServerSession(CNetServerWorker& server, ENetPeer* peer) : | CNetServerSession::CNetServerSession(CNetServerWorker& server, ENetPeer* peer) : | ||||
m_Server(server), m_FileTransferer(this), m_Peer(peer), m_IsLocalClient(false), m_HostID(0), m_GUID(), m_UserName() | m_Server(server), m_FileTransferer(this), m_Peer(peer), m_HostID(0), m_GUID(), m_UserName() | ||||
{ | { | ||||
} | } | ||||
u32 CNetServerSession::GetIPAddress() const | u32 CNetServerSession::GetIPAddress() const | ||||
{ | { | ||||
return m_Peer->address.host; | return m_Peer->address.host; | ||||
} | } | ||||
Show All 31 Lines | void CNetServerSession::DisconnectNow(NetDisconnectReason reason) | ||||
enet_peer_disconnect_now(m_Peer, static_cast<enet_uint32>(reason)); | enet_peer_disconnect_now(m_Peer, static_cast<enet_uint32>(reason)); | ||||
} | } | ||||
bool CNetServerSession::SendMessage(const CNetMessage* message) | bool CNetServerSession::SendMessage(const CNetMessage* message) | ||||
{ | { | ||||
return m_Server.SendMessage(m_Peer, 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) | |||||
Silier: lol | |||||
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 | |||||
} | |||||
void CNetServerSession::SetLongTimeout(bool enabled) | void CNetServerSession::SetLongTimeout(bool enabled) | ||||
{ | { | ||||
SetEnetLongTimeout(m_Peer, m_IsLocalClient, enabled); | SetEnetLongTimeout(m_Peer, enabled); | ||||
} | } |
Wildfire Games · Phabricator
lol