mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 19:05:31 +08:00
Helper class to check whether a network connection can be established
ref #101
This commit is contained in:
85
src/blackmisc/networkchecks.cpp
Normal file
85
src/blackmisc/networkchecks.cpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/* Copyright (C) 2013 VATSIM Community / authors
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "networkchecks.h"
|
||||||
|
#include <QtNetwork/QNetworkInterface>
|
||||||
|
#include <QtNetwork/QTcpSocket>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
|
||||||
|
namespace BlackMisc
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Connected interface?
|
||||||
|
*/
|
||||||
|
bool CNetworkChecks::hasConnectedInterface(bool withDebugOutput)
|
||||||
|
{
|
||||||
|
// http://stackoverflow.com/questions/2475266/verfiying-the-network-connection-using-qt-4-4
|
||||||
|
QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < interfaces.count(); i++)
|
||||||
|
{
|
||||||
|
QNetworkInterface iface = interfaces.at(i);
|
||||||
|
if (iface.flags().testFlag(QNetworkInterface::IsUp) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack))
|
||||||
|
{
|
||||||
|
|
||||||
|
// details of connection
|
||||||
|
if (withDebugOutput) qDebug() << "name:" << iface.name() << endl << "ip addresses:" << endl << "mac:" << iface.hardwareAddress() << endl;
|
||||||
|
|
||||||
|
// this loop is important
|
||||||
|
for (int j = 0; j < iface.addressEntries().count(); j++)
|
||||||
|
{
|
||||||
|
if (withDebugOutput) qDebug() << iface.addressEntries().at(j).ip().toString() << " / " << iface.addressEntries().at(j).netmask().toString() << endl;
|
||||||
|
|
||||||
|
// we have an interface that is up, and has an ip address, therefore the link is present
|
||||||
|
// we will only enable this check on first positive, all later results are incorrect
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Can connect to IP/port?
|
||||||
|
*/
|
||||||
|
bool CNetworkChecks::canConnect(const QString &hostAddress, quint16 port, QString &message, int timeoutMs)
|
||||||
|
{
|
||||||
|
if (!CNetworkChecks::hasConnectedInterface(false))
|
||||||
|
{
|
||||||
|
message = QCoreApplication::translate("BlackMisc", "No connected network interface");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://qt-project.org/forums/viewthread/9346
|
||||||
|
QTcpSocket socket;
|
||||||
|
bool connected = false;
|
||||||
|
socket.connectToHost(hostAddress, port);
|
||||||
|
if (!socket.waitForConnected(timeoutMs))
|
||||||
|
{
|
||||||
|
message = QCoreApplication::translate("BlackMisc", "Connection failed : %1").arg(socket.errorString());
|
||||||
|
connected = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message = QCoreApplication::translate("BlackMisc", "OK, connected");
|
||||||
|
connected = true;
|
||||||
|
}
|
||||||
|
socket.close();
|
||||||
|
return connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Can connect server?
|
||||||
|
*/
|
||||||
|
bool CNetworkChecks::canConnect(const Network::CServer &server, QString &message, int timeoutMs)
|
||||||
|
{
|
||||||
|
return CNetworkChecks::canConnect(server.getAddress(), server.getPort(), message, timeoutMs);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
57
src/blackmisc/networkchecks.h
Normal file
57
src/blackmisc/networkchecks.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/* Copyright (C) 2013 VATSIM Community / authors
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef BLACKMISC_NETWORKCHECKS_H
|
||||||
|
#define BLACKMISC_NETWORKCHECKS_H
|
||||||
|
|
||||||
|
#include "nwserver.h"
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace BlackMisc
|
||||||
|
{
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Utilities checking whether a network connection can be established
|
||||||
|
*/
|
||||||
|
class CNetworkChecks
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/*!
|
||||||
|
* \brief Constructor
|
||||||
|
*/
|
||||||
|
CNetworkChecks() {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*!
|
||||||
|
* \brief Is a connected interface available?
|
||||||
|
* \param withDebugOutput enables some debugging output
|
||||||
|
* \return
|
||||||
|
*/
|
||||||
|
static bool hasConnectedInterface(bool withDebugOutput = false);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Can connect?
|
||||||
|
* \param hostAddress 130.4.20.3, or myserver.com
|
||||||
|
* \param port 80, 1234
|
||||||
|
* \param timeoutMs
|
||||||
|
* \param message human readable message
|
||||||
|
* \return
|
||||||
|
*/
|
||||||
|
static bool canConnect(const QString &hostAddress, quint16 port, QString &message, int timeoutMs = 1500);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Can connect to server?
|
||||||
|
* \param server
|
||||||
|
* \param message human readable message
|
||||||
|
* \param timeoutMs
|
||||||
|
* \return
|
||||||
|
*/
|
||||||
|
static bool canConnect(const BlackMisc::Network::CServer &server, QString &message, int timeoutMs = 1500);
|
||||||
|
|
||||||
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
#endif // guard
|
||||||
|
|
||||||
Reference in New Issue
Block a user