aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/authserver/Server/AuthSession.cpp3
-rw-r--r--src/server/game/Server/WorldSocket.cpp3
-rw-r--r--src/server/shared/Networking/Socket.h31
3 files changed, 29 insertions, 8 deletions
diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp
index 76f8b8c27b0..9931595e860 100644
--- a/src/server/authserver/Server/AuthSession.cpp
+++ b/src/server/authserver/Server/AuthSession.cpp
@@ -169,6 +169,9 @@ void AuthSession::ReadDataHandler()
void AuthSession::AsyncWrite(ByteBuffer& packet)
{
+ if (!IsOpen())
+ return;
+
std::lock_guard<std::mutex> guard(_writeLock);
bool needsWriteStart = _writeQueue.empty();
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 1b134ecbe91..d2602e83944 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -124,6 +124,9 @@ void WorldSocket::ReadDataHandler()
void WorldSocket::AsyncWrite(WorldPacket& packet)
{
+ if (!IsOpen())
+ return;
+
if (sPacketLog->CanLogPacket())
sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort());
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index b04d24b79cc..c8bd5a1dd81 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -20,7 +20,7 @@
#include "MessageBuffer.h"
#include "Log.h"
-#include <atomic>
+#include <atomic>
#include <vector>
#include <mutex>
#include <queue>
@@ -47,6 +47,18 @@ public:
_readHeaderBuffer.Grow(headerSize);
}
+ virtual ~Socket()
+ {
+ boost::system::error_code error;
+ _socket.close(error);
+
+ while (!_writeQueue.empty())
+ {
+ DeletePacket(_writeQueue.front());
+ _writeQueue.pop();
+ }
+ }
+
virtual void Start() = 0;
boost::asio::ip::address GetRemoteIpAddress() const
@@ -61,6 +73,9 @@ public:
void AsyncReadHeader()
{
+ if (!IsOpen())
+ return;
+
_readHeaderBuffer.ResetWritePointer();
_readDataBuffer.Reset();
@@ -69,6 +84,9 @@ public:
void AsyncReadData(std::size_t size)
{
+ if (!IsOpen())
+ return;
+
if (!size)
{
// if this is a packet with 0 length body just invoke handler directly
@@ -82,6 +100,9 @@ public:
void ReadData(std::size_t size)
{
+ if (!IsOpen())
+ return;
+
boost::system::error_code error;
_readDataBuffer.Grow(size);
@@ -113,16 +134,10 @@ public:
return;
boost::system::error_code shutdownError;
- _socket.shutdown(boost::asio::socket_base::shutdown_both, shutdownError);
+ _socket.shutdown(boost::asio::socket_base::shutdown_send, shutdownError);
if (shutdownError)
TC_LOG_DEBUG("network", "Socket::CloseSocket: %s errored when shutting down socket: %i (%s)", GetRemoteIpAddress().to_string().c_str(),
shutdownError.value(), shutdownError.message().c_str());
-
- boost::system::error_code error;
- _socket.close(error);
- if (error)
- TC_LOG_DEBUG("network", "Socket::CloseSocket: %s errored when closing socket: %i (%s)", GetRemoteIpAddress().to_string().c_str(),
- error.value(), error.message().c_str());
}
virtual bool IsHeaderReady() const { return _readHeaderBuffer.IsMessageReady(); }