From e77c0b6ed4516c09c648a6443b054b8b9e1edcf1 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 27 Jul 2014 14:59:46 +0200 Subject: Core/Network: Allow storing any packet types in Socket write queue to reduce the amount of copying going on --- src/server/shared/Networking/Socket.h | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'src/server/shared/Networking') diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 676418c27a7..96f597257be 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore - * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -26,12 +25,13 @@ #include #include #include +#include #include #include using boost::asio::ip::tcp; -template +template class Socket : public std::enable_shared_from_this { public: @@ -44,12 +44,14 @@ public: void AsyncReadHeader() { - _socket.async_read_some(boost::asio::buffer(_readBuffer, _headerSize), std::bind(&Socket::ReadHeaderHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); + _socket.async_read_some(boost::asio::buffer(_readBuffer, _headerSize), std::bind(&Socket::ReadHeaderHandlerInternal, this->shared_from_this(), + std::placeholders::_1, std::placeholders::_2)); } void AsyncReadData(std::size_t size, std::size_t bufferOffset) { - _socket.async_read_some(boost::asio::buffer(&_readBuffer[bufferOffset], size), std::bind(&Socket::ReadDataHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); + _socket.async_read_some(boost::asio::buffer(&_readBuffer[bufferOffset], size), std::bind(&Socket::ReadDataHandlerInternal, this->shared_from_this(), + std::placeholders::_1, std::placeholders::_2)); } void ReadData(std::size_t size, std::size_t bufferOffset) @@ -57,9 +59,10 @@ public: _socket.read_some(boost::asio::buffer(&_readBuffer[bufferOffset], size)); } - void AsyncWrite(std::vector const& data) + void AsyncWrite(PacketType const& data) { - boost::asio::async_write(_socket, boost::asio::buffer(data), std::bind(&Socket::WriteHandler, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); + boost::asio::async_write(_socket, boost::asio::buffer(data), std::bind(&Socket::WriteHandler, this->shared_from_this(), std::placeholders::_1, + std::placeholders::_2)); } bool IsOpen() const { return _socket.is_open(); } @@ -68,7 +71,8 @@ public: boost::system::error_code socketError; _socket.close(socketError); if (socketError) - TC_LOG_DEBUG("network", "Socket::CloseSocket: %s errored when closing socket: %i (%s)", GetRemoteIpAddress().to_string().c_str(), socketError.value(), socketError.message().c_str()); + TC_LOG_DEBUG("network", "Socket::CloseSocket: %s errored when closing socket: %i (%s)", GetRemoteIpAddress().to_string().c_str(), + socketError.value(), socketError.message().c_str()); } uint8* GetReadBuffer() { return _readBuffer; } @@ -78,7 +82,7 @@ protected: virtual void ReadDataHandler(boost::system::error_code error, size_t transferedBytes) = 0; std::mutex _writeLock; - std::queue > _writeQueue; + std::queue _writeQueue; private: void ReadHeaderHandlerInternal(boost::system::error_code error, size_t transferedBytes) { ReadHeaderHandler(error, transferedBytes); } @@ -90,6 +94,7 @@ private: { std::lock_guard deleteGuard(_writeLock); + DeletePacket(_writeQueue.front()); _writeQueue.pop(); if (!_writeQueue.empty()) @@ -99,6 +104,12 @@ private: CloseSocket(); } + template + typename std::enable_if::value>::type DeletePacket(PacketType& packet) { delete packet; } + + template + typename std::enable_if::value>::type DeletePacket(PacketType const& /*packet*/) { } + tcp::socket _socket; uint8 _readBuffer[4096]; -- cgit v1.2.3 From e502e01f5d16964e67685c956e204ae41b756d26 Mon Sep 17 00:00:00 2001 From: leak Date: Sun, 27 Jul 2014 17:33:56 +0200 Subject: Fixed a rare crash case when authserver socket was forcefully closed during read Closes #12634 --- src/server/shared/Networking/Socket.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/server/shared/Networking') diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 96f597257be..9c3ec180b0a 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -56,7 +56,16 @@ public: void ReadData(std::size_t size, std::size_t bufferOffset) { - _socket.read_some(boost::asio::buffer(&_readBuffer[bufferOffset], size)); + boost::system::error_code error; + + _socket.read_some(boost::asio::buffer(&_readBuffer[bufferOffset], size), error); + + if (error) + { + TC_LOG_DEBUG("network", "Socket::ReadData: %s errored with: %i (%s)", GetRemoteIpAddress().to_string().c_str(), error.value(), error.message().c_str()); + + CloseSocket(); + } } void AsyncWrite(PacketType const& data) @@ -68,11 +77,11 @@ public: bool IsOpen() const { return _socket.is_open(); } void CloseSocket() { - boost::system::error_code socketError; - _socket.close(socketError); - if (socketError) + 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(), - socketError.value(), socketError.message().c_str()); + error.value(), error.message().c_str()); } uint8* GetReadBuffer() { return _readBuffer; } -- cgit v1.2.3