From f5bf13295cb8790fd66e12f8a879795891190da7 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 10 Aug 2014 21:32:57 +0200 Subject: Core/NetworkIO: Prevent double closing the same socket --- src/server/shared/Networking/Socket.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/server/shared') diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 4a3f2990799..9d46d7130bc 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -40,10 +40,9 @@ class Socket : public std::enable_shared_from_this typedef typename std::conditional::value, PacketType, PacketType const&>::type WritePacketType; public: - Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)) + Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _remoteAddress(_socket.remote_endpoint().address()), + _remotePort(_socket.remote_endpoint().port()), _readHeaderBuffer(), _readDataBuffer(), _closed(false) { - _remoteAddress = _socket.remote_endpoint().address(); - _remotePort = _socket.remote_endpoint().port(); _readHeaderBuffer.Grow(headerSize); } @@ -105,9 +104,13 @@ public: std::placeholders::_1, std::placeholders::_2)); } - bool IsOpen() const { return _socket.is_open(); } + bool IsOpen() const { return !_closed; } + void CloseSocket() { + if (_closed.exchange(true)) + return; + boost::system::error_code shutdownError; _socket.shutdown(boost::asio::socket_base::shutdown_both, shutdownError); if (shutdownError) @@ -217,6 +220,8 @@ private: MessageBuffer _readHeaderBuffer; MessageBuffer _readDataBuffer; + + std::atomic _closed; }; #endif // __SOCKET_H__ -- cgit v1.2.3