diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 80655441ec2b2..0674ede57d855 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -55,11 +55,11 @@ class Socket : public std::enable_shared_from_this virtual bool Update() { - if (!IsOpen()) + if (_closed) return false; #ifndef TC_SOCKET_USE_IOCP - if (_isWritingAsync || _writeQueue.empty()) + if (_isWritingAsync || (_writeQueue.empty() && !_closing)) return true; for (; HandleQueue();) @@ -164,7 +164,6 @@ class Socket : public std::enable_shared_from_this GetRemoteIpAddress().to_string().c_str(), err.value(), err.message().c_str()); } - private: void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes) { @@ -208,9 +207,6 @@ class Socket : public std::enable_shared_from_this bool HandleQueue() { - if (!IsOpen()) - return false; - if (_writeQueue.empty()) return false; @@ -227,11 +223,15 @@ class Socket : public std::enable_shared_from_this return AsyncProcessQueue(); _writeQueue.pop(); + if (_closing && _writeQueue.empty()) + CloseSocket(); return false; } else if (bytesSent == 0) { _writeQueue.pop(); + if (_closing && _writeQueue.empty()) + CloseSocket(); return false; } else if (bytesSent < bytesToSend) // now n > 0 @@ -241,6 +241,8 @@ class Socket : public std::enable_shared_from_this } _writeQueue.pop(); + if (_closing && _writeQueue.empty()) + CloseSocket(); return !_writeQueue.empty(); }