/* XMRig * Copyright 2010 Jeff Garzik * Copyright 2012-2014 pooler * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee * Copyright 2016-2017 XMRig * * * 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 Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "Console.h" #include "net/Client.h" #include "net/Network.h" #include "net/Url.h" #include "Options.h" Network::Network(const Options *options) : m_donate(false), m_options(options), m_pool(0) { m_pools.reserve(2); m_agent = userAgent(); auto url = std::make_unique("donate.xmrig.com", 443); addPool(url.get()); addPool(m_options->url()); addPool(m_options->backupUrl()); } Network::~Network() { for (auto client : m_pools) { delete client; } free(m_agent); } void Network::connect() { m_pools.at(1)->connect(); } void Network::onClose(Client *client, int failures) { const int id = client->id(); if (id == 0 && failures == -1) { m_donate = false; return; } if (m_pool == id) { m_pool = 0; } if (id == 1 && m_pools.size() > 2 && failures == m_options->retries()) { m_pools.at(2)->connect(); } } void Network::onJobReceived(Client *client, const Job &job) { } void Network::onLoginCredentialsRequired(Client *client) { client->login(m_options->user(), m_options->pass(), m_agent); } void Network::onLoginSuccess(Client *client) { const int id = client->id(); if (id == 0) { m_donate = true; return; } if (id == 2 && m_pool) { // primary pool is already active m_pools.at(2)->disconnect(); return; } LOG_NOTICE("use pool: \"%s:%d\"", client->host(), client->port()); m_pool = id; if (m_pool == 1 && m_pools.size() > 2) { // try disconnect from backup pool m_pools.at(2)->disconnect(); } } void Network::addPool(const Url *url) { if (!url) { return; } Client *client = new Client(m_pools.size(), this); client->setUrl(url); client->setRetryPause(m_options->retryPause() * 1000); client->setKeepAlive(m_options->keepAlive()); m_pools.push_back(client); }