From fb22940639814e35ce31f7c0f412e7d48c7469a9 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Mon, 15 Jun 2015 00:33:48 +0200 Subject: [PATCH 1/2] Small refactor in Session::setListeningPort() --- src/core/bittorrent/session.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/core/bittorrent/session.cpp b/src/core/bittorrent/session.cpp index ad64966e0..f7457313e 100644 --- a/src/core/bittorrent/session.cpp +++ b/src/core/bittorrent/session.cpp @@ -1489,18 +1489,23 @@ void Session::setListeningPort(int port) return; } - QString ip; - qDebug("This network interface has %d IP addresses", network_iface.addressEntries().size()); - foreach (const QNetworkAddressEntry &entry, network_iface.addressEntries()) { - if ((!listen_ipv6 && (entry.ip().protocol() == QAbstractSocket::IPv6Protocol)) - || (listen_ipv6 && (entry.ip().protocol() == QAbstractSocket::IPv4Protocol))) + const QList addresses = network_iface.addressEntries(); + qDebug("This network interface has %d IP addresses", addresses.size()); + QHostAddress ip; + QString ipString; + QAbstractSocket::NetworkLayerProtocol protocol; + foreach (const QNetworkAddressEntry &entry, addresses) { + ip = entry.ip(); + ipString = ip.toString(); + protocol = ip.protocol(); + Q_ASSERT(protocol == QAbstractSocket::IPv4Protocol || protocol == QAbstractSocket::IPv6Protocol); + if ((!listen_ipv6 && (protocol == QAbstractSocket::IPv6Protocol)) + || (listen_ipv6 && (protocol == QAbstractSocket::IPv4Protocol))) continue; - - qDebug("Trying to listen on IP %s (%s)", qPrintable(entry.ip().toString()), qPrintable(iface_name)); - m_nativeSession->listen_on(ports, ec, entry.ip().toString().toLatin1().constData(), libt::session::listen_no_system_port); + qDebug("Trying to listen on IP %s (%s)", qPrintable(ipString), qPrintable(iface_name)); + m_nativeSession->listen_on(ports, ec, ipString.toLatin1().constData(), libt::session::listen_no_system_port); if (!ec) { - ip = entry.ip().toString(); - logger->addMessage(tr("qBittorrent is trying to listen on interface %1 port: %2", "e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881").arg(ip).arg(QString::number(port)), Log::INFO); + logger->addMessage(tr("qBittorrent is trying to listen on interface %1 port: %2", "e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881").arg(ipString).arg(port), Log::INFO); return; } } From f108e67dcc499af473ae48fced71ae40bed5b628 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Mon, 15 Jun 2015 00:06:56 +0200 Subject: [PATCH 2/2] Call setListeningPort() when state of network interface changes (closes qbittorrent/qBittorrent#475, closes qbittorrent/qBittorrent#3072) --- src/core/bittorrent/session.cpp | 28 +++++++++++++++++++++++++--- src/core/bittorrent/session.h | 9 ++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/core/bittorrent/session.cpp b/src/core/bittorrent/session.cpp index f7457313e..f442ec2e3 100644 --- a/src/core/bittorrent/session.cpp +++ b/src/core/bittorrent/session.cpp @@ -202,6 +202,12 @@ Session::Session(QObject *parent) configure(); connect(pref, SIGNAL(changed()), SLOT(configure())); + // Network configuration monitor + connect(&m_networkManager, SIGNAL(onlineStateChanged(bool)), SLOT(networkOnlineStateChanged(bool))); + connect(&m_networkManager, SIGNAL(configurationAdded(const QNetworkConfiguration&)), SLOT(networkConfigurationChange(const QNetworkConfiguration&))); + connect(&m_networkManager, SIGNAL(configurationRemoved(const QNetworkConfiguration&)), SLOT(networkConfigurationChange(const QNetworkConfiguration&))); + connect(&m_networkManager, SIGNAL(configurationChanged(const QNetworkConfiguration&)), SLOT(networkConfigurationChange(const QNetworkConfiguration&))); + m_resumeDataTimer->start(); // initialize PortForwarder instance @@ -483,7 +489,7 @@ void Session::configure() const unsigned short newListenPort = pref->getSessionPort(); if (oldListenPort != newListenPort) { qDebug("Session port changes in program preferences: %d -> %d", oldListenPort, newListenPort); - setListeningPort(newListenPort); + setListeningPort(); } // * Save path @@ -1458,12 +1464,28 @@ void Session::setAppendExtension(bool append) } } +void Session::networkOnlineStateChanged(const bool online) +{ + Logger::instance()->addMessage(tr("System network status changed to %1", "e.g: System network status changed to ONLINE").arg(online ? tr("ONLINE") : tr("OFFLINE")), Log::INFO); +} + +void Session::networkConfigurationChange(const QNetworkConfiguration& cfg) +{ + const QString configuredInterfaceName = Preferences::instance()->getNetworkInterface(); + const QString changedInterface = cfg.name(); + if (configuredInterfaceName.isEmpty() || configuredInterfaceName == changedInterface) { + Logger::instance()->addMessage(tr("Network configuration of %1 has changed, refreshing session binding", "e.g: Network configuration of tun0 has changed, refreshing session binding").arg(changedInterface), Log::INFO); + setListeningPort(); + } +} + // Set the ports range in which is chosen the port // the BitTorrent session will listen to -void Session::setListeningPort(int port) +void Session::setListeningPort() { - qDebug() << Q_FUNC_INFO << port; Preferences* const pref = Preferences::instance(); + const unsigned short port = pref->getSessionPort(); + qDebug() << Q_FUNC_INFO << port; Logger* const logger = Logger::instance(); std::pair ports(port, port); diff --git a/src/core/bittorrent/session.h b/src/core/bittorrent/session.h index 78420e74e..ab96af405 100644 --- a/src/core/bittorrent/session.h +++ b/src/core/bittorrent/session.h @@ -36,6 +36,7 @@ #include #include #include +#include #include "core/tristatebool.h" #include "core/types.h" @@ -227,6 +228,10 @@ namespace BitTorrent void handleRedirectedToMagnet(const QString &url, const QString &magnetUri); void switchToAlternativeMode(bool alternative); + // Session reconfiguration triggers + void networkOnlineStateChanged(const bool online); + void networkConfigurationChange(const QNetworkConfiguration&); + private: explicit Session(QObject *parent = 0); ~Session(); @@ -242,7 +247,7 @@ namespace BitTorrent void setProxySettings(libtorrent::proxy_settings proxySettings); void adjustLimits(); void adjustLimits(libtorrent::session_settings &sessionSettings); - void setListeningPort(int port); + void setListeningPort(); void setDefaultSavePath(const QString &path); void setDefaultTempPath(const QString &path = QString()); void preAllocateAllFiles(bool b); @@ -356,6 +361,8 @@ namespace BitTorrent QWaitCondition m_alertsWaitCondition; QVector m_alerts; + QNetworkConfigurationManager m_networkManager; + static Session *m_instance; }; }