From e22760e4db85c1f77d092eb57f2a49c7cb1b7e78 Mon Sep 17 00:00:00 2001 From: Intel Date: Mon, 5 May 2014 09:25:17 -0400 Subject: [PATCH] Fix packet handling --- src/server/poolserver/Stratum/Client.cpp | 25 ++++++++++++++---------- src/server/poolserver/Stratum/Client.h | 4 +++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/server/poolserver/Stratum/Client.cpp b/src/server/poolserver/Stratum/Client.cpp index 8a8f1ae..f217d4f 100644 --- a/src/server/poolserver/Stratum/Client.cpp +++ b/src/server/poolserver/Stratum/Client.cpp @@ -349,29 +349,34 @@ namespace Stratum { if (!error) { std::istream is(&_recvBuffer); - std::stringstream iss; - iss << is.rdbuf(); - try { - OnMessage(JSON::FromString(iss.str())); - } catch (std::exception& e) { - sLog.Error(LOG_SERVER, "Exception caught while parsing json: %s", e.what()); + char c; + while (is.good()) { + is >> c; + if (c == '\n') { + try { + OnMessage(JSON::FromString(_recvMessage)); + } catch (std::exception& e) { + sLog.Error(LOG_SERVER, "Exception caught while parsing json: %s", e.what()); + } + _recvMessage.clear(); + _recvMessage.reserve(PACKET_ALLOC); + } else + _recvMessage += c; } StartRead(); } else { // Client disconnected if ((error == asio::error::eof) || (error == asio::error::connection_reset)) { - _server->Disconnect(shared_from_this()); + Disconnect(); } } } void Client::_OnSend(const boost::system::error_code& error) { - if (!error) { - // Party - } else { + if (error) { // Client disconnected if ((error == asio::error::eof) || (error == asio::error::connection_reset)) { Disconnect(); diff --git a/src/server/poolserver/Stratum/Client.h b/src/server/poolserver/Stratum/Client.h index a2da229..9d4c274 100644 --- a/src/server/poolserver/Stratum/Client.h +++ b/src/server/poolserver/Stratum/Client.h @@ -15,7 +15,7 @@ #include #include -#define MAX_PACKET 2048 +#define PACKET_ALLOC 128 using namespace boost; using namespace boost::asio::ip; @@ -31,6 +31,7 @@ namespace Stratum { _diff = sConfig.Get("StratumMinDifficulty"); _minDiff = _diff; + _recvMessage.reserve(PACKET_ALLOC); } tcp::socket& GetSocket() @@ -130,6 +131,7 @@ namespace Stratum private: // Networking asio::streambuf _recvBuffer; + std::string _recvMessage; tcp::socket _socket; uint32 _ip; uint64 _id;