diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index 13c9169..e25fe9b 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -516,6 +516,8 @@ void StratumServer::on_blobs_ready() size_t numClientsProcessed = 0; uint32_t extra_nonce = 0; + + const time_t cur_time = time(nullptr); { MutexLock lock2(m_clientsListLock); @@ -523,7 +525,12 @@ void StratumServer::on_blobs_ready() ++numClientsProcessed; if (!client->m_rpcId) { - // Not logged in yet, on_login() will send the job to this client + // Not logged in yet, on_login() will send the job to this client. Also close inactive connections. + if (cur_time >= client->m_connectedTime + 10) { + LOGWARN(4, "client " << static_cast(client->m_addrString) << " didn't send login data"); + client->ban(DEFAULT_BAN_TIME); + client->close(); + } continue; } @@ -760,6 +767,7 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) StratumServer::StratumClient::StratumClient() : m_rpcId(0) + , m_connectedTime(0) , m_jobs{} , m_perConnectionJobId(0) , m_customDiff{} @@ -776,12 +784,19 @@ void StratumServer::StratumClient::reset() { Client::reset(); m_rpcId = 0; + m_connectedTime = 0; memset(m_jobs, 0, sizeof(m_jobs)); m_perConnectionJobId = 0; m_customDiff = {}; m_customUser.clear(); } +bool StratumServer::StratumClient::on_connect() +{ + m_connectedTime = time(nullptr); + return true; +} + bool StratumServer::StratumClient::on_read(char* data, uint32_t size) { if ((data != m_readBuf + m_numRead) || (data + size > m_readBuf + sizeof(m_readBuf))) { diff --git a/src/stratum_server.h b/src/stratum_server.h index 56a30e9..b020ecc 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -45,7 +45,7 @@ public: static Client* allocate() { return new StratumClient(); } void reset() override; - bool on_connect() override { return true; } + bool on_connect() override; bool on_read(char* data, uint32_t size) override; bool process_request(char* data, uint32_t size); @@ -53,6 +53,7 @@ public: bool process_submit(rapidjson::Document& doc, uint32_t id); uint32_t m_rpcId; + time_t m_connectedTime; uv_mutex_t m_jobsLock;