diff options
author | Shauren <shauren.trinity@gmail.com> | 2014-08-11 20:43:07 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2014-08-11 20:43:07 +0200 |
commit | c741d2682a1835b0e9a775d1aba9f795db348450 (patch) | |
tree | be988d054384733bd2a08e24352055fa23a31a60 /src | |
parent | e9943914ab726c563d6d98fbd4d123b2c1b95e60 (diff) |
Core/NetworkIO: Prevent queueing more async operations when socket is already closed
Diffstat (limited to 'src')
-rw-r--r-- | src/server/authserver/Server/AuthSession.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 3 | ||||
-rw-r--r-- | src/server/shared/Networking/Socket.h | 31 |
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(); } |