1
0

Shutdown connection when disconnect packet sent (#3999)

This commit is contained in:
Alexander Harkness 2017-09-08 08:36:23 +01:00 committed by Mattes D
parent b12f4ef7d5
commit c334824199
2 changed files with 11 additions and 11 deletions

View File

@ -2087,6 +2087,12 @@ void cClientHandle::Tick(float a_Dt)
return; return;
} }
// If player has been kicked, terminate the connection:
if (m_State == csKicked)
{
m_Link->Shutdown();
}
// If destruction is queued, destroy now: // If destruction is queued, destroy now:
if (m_State == csQueuedForDestruction) if (m_State == csQueuedForDestruction)
{ {
@ -2515,6 +2521,10 @@ void cClientHandle::SendDisconnect(const AString & a_Reason)
LOGD("Sending a DC: \"%s\"", StripColorCodes(a_Reason).c_str()); LOGD("Sending a DC: \"%s\"", StripColorCodes(a_Reason).c_str());
m_Protocol->SendDisconnect(a_Reason); m_Protocol->SendDisconnect(a_Reason);
m_HasSentDC = true; m_HasSentDC = true;
// csKicked means m_Link will be shut down on the next tick. The
// disconnect packet data is sent in the tick thread so the connection
// is closed there after the data is sent.
m_State = csKicked;
} }
} }
@ -3389,7 +3399,3 @@ void cClientHandle::OnError(int a_ErrorCode, const AString & a_ErrorMsg)
} }
SocketClosed(); SocketClosed();
} }

View File

@ -491,11 +491,10 @@ private:
csDownloadingWorld, ///< The client is waiting for chunks, we're waiting for the loader to provide and send them csDownloadingWorld, ///< The client is waiting for chunks, we're waiting for the loader to provide and send them
csConfirmingPos, ///< The client has been sent the position packet, waiting for them to repeat the position back csConfirmingPos, ///< The client has been sent the position packet, waiting for them to repeat the position back
csPlaying, ///< Normal gameplay csPlaying, ///< Normal gameplay
csKicked, ///< Disconnect packet sent, awaiting connection closure
csQueuedForDestruction, ///< The client will be destroyed in the next tick (flag set when socket closed) csQueuedForDestruction, ///< The client will be destroyed in the next tick (flag set when socket closed)
csDestroying, ///< The client is being destroyed, don't queue any more packets / don't add to chunks csDestroying, ///< The client is being destroyed, don't queue any more packets / don't add to chunks
csDestroyed, ///< The client has been destroyed, the destructor is to be called from the owner thread csDestroyed, ///< The client has been destroyed, the destructor is to be called from the owner thread
// TODO: Add Kicking here as well
} ; } ;
/* Mutex protecting m_State from concurrent writes. */ /* Mutex protecting m_State from concurrent writes. */
@ -595,8 +594,3 @@ private:
virtual void OnRemoteClosed(void) override; virtual void OnRemoteClosed(void) override;
virtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override; virtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;
}; // tolua_export }; // tolua_export