【问题标题】:Test a local connection with Qt使用 Qt 测试本地连接
【发布时间】:2014-07-21 11:34:13
【问题描述】:

有没有办法使用 Qt检查电缆是否没有拔掉

我知道我想联系的Ip adress,起初我想在这个Ip Adress 上做一个ping request,但对于这个简单的任务来说似乎太复杂了。

所以我在想,QNetwork library 中有一个简单的函数可以做到这一点。

我在互联网上搜索,但所有解决方案都没有测试一个特定的 IP。

感谢您的帮助。

【问题讨论】:

    标签: c++ qt qnetworkaccessmanager


    【解决方案1】:

    有没有办法使用Qt检查电缆是否没有拔掉?

    您可以使用QNetworkSession为指定接口实现此目的:

    QNetworkConfigurationManager nwManager (this);
    for (;;QThread::sleep (1) ) {
        bool isConfigurationFound {false};
        for (auto & configuration : nwManager.allConfigurations (/*QNetworkConfiguration::Active*/) ) {
            // Name depends on the environment: "Wired connection 1", "McDonaldsFreeWiFi", "Home", "eth0", "eth1", etc...
            if (isConfigurationFound = (configuration.name () == "eth0") ) {
                QNetworkSession session (configuration, this);
                session.open ();
                session.waitForOpened (/*timeout*/);
    
                qDebug () << "Session info:";
                qDebug () << "- usage: " << (session.isOpen () ? "Opened" : "Closed");
                qDebug () << "- state: " << (session.state  () == QNetworkSession::Connected ? "Connected" : "Not connected");
    
                break;
            }
        }
        qDebug () << (isConfigurationFound ? "" : "Configuration not found.");
    }
    

    如果您使用连接的电缆启动此代码,您会得到:

    "Session info:" 
    "- usage: Opened;" 
    "- state: Connected;" 
    

    如果你拔掉电缆,你会得到:

    "Session info:" 
    "- usage: Closed" 
    "- state: Not connected"
    

    这里是完整的例子(也可以在GitLab获得):

    CMakeLists.txt

    cmake_minimum_required (VERSION 2.8.8)
    project (NaQt)
    find_package (Qt5Network)
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
    set (NaQt_SOURCES ${PROJECT_SOURCE_DIR}/main.cpp)
    set (NaQt_HEADERS ${PROJECT_SOURCE_DIR}/NetworkAnalyzer.h)
    qt5_wrap_cpp (NaQt_HEADERS_MOC ${NaQt_HEADERS})
    
    add_executable (
        naqt
        ${NaQt_SOURCES}
        ${NaQt_HEADERS_MOC}
    )
    target_link_libraries (
        naqt
        Qt5::Core
        Qt5::Network
    )
    

    main.cpp

    #include <QtCore>
    #include "NetworkAnalyzer.h"
    
    int main (int argc, char * argv [])
    {
        QCoreApplication application (argc, argv);
        NetworkAnalyzer networkAnalyzer (& application);
        return application.exec ();
    }
    

    NetworkAnalyzer.h

    #ifndef QT_NETWORK_ANALYZER_H
    #define QT_NETWORK_ANALYZER_H
    
    #include <QThread>
    #include <QNetworkConfigurationManager>
    #include <QNetworkSession>
    #include <QDebug>
    
    class NetworkAnalyzer : public QObject
    {
    Q_OBJECT
    
    public:
        NetworkAnalyzer (QObject * parent = nullptr)
        {
            QNetworkConfigurationManager nwManager (this);
            for (;;QThread::sleep (1) ) {
                bool isConfigurationFound {false};
                for (auto & configuration : nwManager.allConfigurations (/*QNetworkConfiguration::Active*/) ) {
                    // Name depends on the environment: "Wired connection 1", "McDonaldsFreeWiFi", "Home", "eth0", "eth1", etc...
                    if (isConfigurationFound = (configuration.name () == "eth0") ) {
                        QNetworkSession session (configuration, this);
                        session.open ();
                        session.waitForOpened (/*timeout*/);
    
                        qDebug () << "Session info:";
                        qDebug () << "- usage: " << (session.isOpen () ? "Opened" : "Closed");
                        qDebug () << "- state: " << (session.state  () == QNetworkSession::Connected ? "Connected" : "Not connected");
    
                        break;
                    }
                }
                qDebug () << (isConfigurationFound ? "" : "Configuration not found.");
            }
        }
    };
    
    #endif//QT_NETWORK_ANALYZER_H
    

    【讨论】:

    • 这行得通,但我的电脑上有 2 个以太网卡,我想知道哪个没有连接,有没有办法从会话或类似的东西中获取 IP 地址?跨度>
    • but I have 2 ethernet card on my computer and I want to know which one isn't connected - 为此目的测试“eth0”和“eth1”接口的连接。 is there a way to get the Ip adress from session or something like that? - 我对这个问题也很感兴趣,不幸的是我没有找到任何解决方案。
    【解决方案2】:

    尝试在预定义的端口上打开到指定 IP 地址的套接字:

    QTcpSocket tester;
    
    tester.connectToHost(address, port);
    
    if(tester.waitForConnected(3000)) {
        //Remote host is online
    } else {
        //Remote host is offline
    }
    

    【讨论】:

    • 如何等待连接,而不冻结整个程序?
    • 设置一个定时器并等待来自 QTcpSocket 的 connected() 信号。
    • 对我来说它仍然是阻塞的,你能提供一个例子吗?
    • @EvansBelloeil 你可以试试 QtConcurrent::Run 来满足这个需求
    【解决方案3】:

    使用 QT 的 QNetworkAccessManager 类,它提供 networkAccessibleChanged 信号 并将插槽连接到它

    connect(&networkAccessManager, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)), this, SLOT(onNetworkAccessibilityChanged(QNetworkAccessManager::NetworkAccessibility)));
    

    当以太网电缆被拔出时它会发出信号提示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多