Qt判斷網絡是否在

我們已知的網絡連接有3種:撥號、使用局域網以及代理上網。

無論哪一種上網方式都可以判斷網絡是否暢通,藉此,我們來做一個判斷網絡是否暢通(存在)的程序,新建一個基類爲QWidget的工程,不要UI。

添加新文件:C++Class → Class Name :isonl、Base Name :QWidget

頭函數 >> isonl.h。

 1 #ifndef ISONL_H
 2 #define ISONL_H
 3 //撥號
 4 #define INTERNET_CONNECTION_MODEM   1
 5 //局域網
 6 #define INTERNET_CONNECTION_LAN     2
 7 //代理上網
 8 #define INTERNET_CONNECTION_PROXY   4
 9 //代理被佔用
10 #define INTERNET_CONNECTION_MODEM_BUSY  8
11 
12 #include <QWidget>
13 
14 class isOnl : public QWidget
15 {
16     Q_OBJECT
17 public:
18     explicit isOnl(QWidget *parent = 0);
19     int a;  //用來做一個標識
20 private slots:
21     void GetInternetConnectState(); //獲取Internet連接狀態
22 signals:
23     void returnisonline(int);   //發射信號
24 public slots:
25 };
26 
27 #endif // ISONL_H

源代碼 >> isonl.cpp

#include "isonl.h"
#include <QLibrary>
#include <QTimer>
//定義函數指針
typedef bool (*ConnectFun)(int* lpdwFlags,int  dwReserved);
isOnl::isOnl(QWidget *parent) : QWidget(parent)
{
    a = -1;
    QTimer *timer=new QTimer(this);            //新建一個定時器對象
    connect(timer,SIGNAL(timeout()),this,SLOT(GetInternetConnectState()));
    timer->start(100);     //時間間隔1秒。每1秒獲取一次,
    GetInternetConnectState();
}
//獲得聯網方式
void isOnl::GetInternetConnectState()
{
    QLibrary lib("Wininet.dll");
    //如果正確加載了dll
    if(lib.load())
    {
        bool bOnline=false;//是否在線
        int  flags;
        //獲取dll庫中的函數InternetGetConnectedState函數地址`
        ConnectFun  myConnectFun=(ConnectFun)lib.resolve("InternetGetConnectedState");
        //判斷是否連網
        bOnline=myConnectFun(&flags,0);
        if(bOnline)
        {
            //在線:撥號上網
            if ( flags & INTERNET_CONNECTION_MODEM ) //在線:撥號上網
            {
                a=1;

            } else  if(flags & INTERNET_CONNECTION_LAN)  //在線:通過局域網
            {
                a=2;
            }
            else if(flags & INTERNET_CONNECTION_PROXY) //在線:代理
            {
                a=4;
            }
        }
        else
        {
            a = -1;
        }
        emit returnisonline(a);//信號發射出去
    }
}

在工程文件(widget.pro)中添加

 1 QT += core gui network 

此時,我們的網絡判斷已經做好,接下來是如何去運用。

在頭函數widget.h中

 1 #include "isonl.h"
 2 
 3 //定義私有變量
 4 private:
 5     isOnl *online;
 6 
 7 //添加一個私有槽信號用來實現
 8 private slots:
 9     void showOnline(int);
10 
11 //添加一個信號槽函數,與之相對
12 signals:
13     void returnisonline(int);
14 //這個函數好像是不能被省略,我的系統是Win10測試的時候如何沒有此函數,會導致出錯。

在源代碼widget.cpp中

 1 //在構造函數中添加
 2 online = new isOnl;
 3 connect(online,SIGNAL(returnisonline(int)),this,SLOT(showOnline(int)));
 4 
 5 //獲取網絡是否暢通
 6 void Widget::showOnline(int a)
 7 {
 8     if(a == 1 || a == 2 || a == 4)
 9     {
10         //當網絡暢通時執行這裏面的內容
11         //label2 ->setStyleSheet("background-color:lightgreen;");//淺綠
12     }
13     else if(a == -1)
14     {
15         //當網絡中斷時執行這裏面的內容
16         //label2 ->setStyleSheet("background-color:red;");
17     }
18 
19 }

以上就是Qt判斷網絡是否存在的內容,此內容還可以運用到:判斷網絡連接方式,有興趣的可以嘗試一下。

有問題請留言,或者聯繫QQ:1285015525 也可以發郵箱[email protected]。(本文只出現在Aili_Xiao的博客中,目前在博客園和CDSN中)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章