QT5开发||14、QT5网络与通信

摘要:

在应用程序开发中网络编程非常重要,目前互联网通行的TCP/IP协议,自上而下分为应用层、传输层、网际层和网络接口层这四层。

实际编写网络应用程序时只使用到传输层和应用层,所涉及的协议主要包括UDP、TCP、FTP和HTTP等。

操作系统:虽然目前主流的操作系统(Windows、Linux等)都提供了统一的套接字(Socket)抽象编程接口(API),用于编写

不同层次的网络程序,但是这种方式比较烦琐,甚至有时需要引用底层操作系统的相关数据结构,而Qt提供的网络模

块QtNetwork,圆满地解决了这一问题。

一、获取本机网络信息

在网络应用中,经常需要获得本机的主机名、IP 地址和硬件地址等网络信息。

在Qt中,需要运用QHostInfo、QNetworkInterface、 QNetwork AddresEntry等类可获得本机的网络信息。

实例分析:获取本机的网络信息。

具体实现步骤:

(1) 新建Qt Gui应用 ,选择Qt Widgets Application,项目名称为“NetworkInformation”, 基类选择“ QMainWindow”,类

名命名为“networkinformation”,勾选“创建界面”复选框的选中状态。 如下图所示。

在这里插入图片描述
(2)头文件“networkinformation.h” 的类声明代码如下:

class NetworkInformation : public QWidget
{
    
    
    Q_OBJECT
    
public:
    NetworkInformation(QWidget *parent = 0);
    ~NetworkInformation();
    
private:
    QLabel *hostLabel;
    QLineEdit *LineEditLocalHostName;
    QLabel *ipLabel;
    QLineEdit *LineEditAddress;

    QPushButton *detailBtn;

    QGridLayout *mainLayout;
};

头文件包含代码如下:

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QGridLayout>
#include <QMessageBox>
#include <QHostInfo>
#include <QNetworkInterface>

(3)源文件“networkinformation.cpp”的具体代码如下:

构造、析构函数:

NetworkInformation::NetworkInformation(QWidget *parent)
    : QWidget(parent)
{
    
    
    hostLabel = new QLabel(tr("主机名:"));
    LineEditLocalHostName = new QLineEdit;
    ipLabel = new QLabel(tr("IP 地址:"));
    LineEditAddress = new QLineEdit;

    detailBtn = new QPushButton(tr("详细"));

    mainLayout = new QGridLayout(this);
    mainLayout->addWidget(hostLabel,0,0);
    mainLayout->addWidget(LineEditLocalHostName,0,1);
    mainLayout->addWidget(ipLabel,1,0);
    mainLayout->addWidget(LineEditAddress,1,1);
    mainLayout->addWidget(detailBtn,2,0,1,2);

}
NetworkInformation::~NetworkInformation()
{
    
     
}

此时,运行结果如下图:
在这里插入图片描述

以上代码用于完成了NetworkInformation显示界面,下面开始实现获取本机网络信息的内容。

(1)在文件“NetworkInformation.pro” 中添加如下代码:

QT += network

(2)在头文件“networkinformation.h"中添加如下代码:

#include <QHostInfo>
#include <QNetworkInterface>

public:
	void getHostInformation();
public slots:
    void slotDetail();

(3)在源文件“networkinformation.cpp"中添加代码。其中,在构造函数的最后添加:

getHostInformation() ;
connect (detailBtn, SIGNAL(clicked())this, SLOT (slotDetail())) ;

getHostInformation()函数用于获得主机信息。具体实现代码如下:

void NetworkInformation::getHostInformation()
{
    
    
    QString localHostName = QHostInfo::localHostName();
    LineEditLocalHostName->setText(localHostName);

    QHostInfo hostInfo = QHostInfo::fromName(localHostName);
    QList<QHostAddress> listAddress = hostInfo.addresses();
    if(!listAddress.isEmpty())
    {
    
    
        LineEditAddress->setText(listAddress.first().toString());
    }
}

解析:
●QString localHostName = QHostInfo:;localHostNameO:获得本机主机名。QHostInfo提供了一系列有关网络信息的静态函数,可以根据主机名获得分配的IP地址,也可以根据IP地址获得相应的主机名。

●QHostInfo hostInfo = QHostInfo::fromName(localHostName):根据主机名获得相关主机信息,包括IP地址等。 QHostInfo::fromName()函 数通过主机名查找IP地址信息。

●QList listAddress = hostInfoaddresses(:获得主机的IP地址列表。

●if(!listAddress.isEmpty)…}:获得的主机IP地址列表可能为空。在不为空的情况下使用第一个IP地址。

slotDetail()函数获得与网络接口相关的信息,具体实现代码如下:

void NetworkInformation::slotDetail()
{
    
    
    QString detail="";
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();
    for(int i=0;i<list.count();i++)
    {
    
    
        QNetworkInterface interface=list.at(i);
        detail=detail+tr("设备:")+interface.name()+"\n";
        detail=detail+tr("硬件地址:")+interface.hardwareAddress()+"\n";
        QList<QNetworkAddressEntry> entryList=interface.addressEntries();
        for(int j=0;j<entryList.count();j++)
        {
    
    
            QNetworkAddressEntry entry=entryList.at(j);
            detail=detail+"\t"+tr("IP 地址:")+entry.ip().toString()+"\n";
            detail=detail+"\t"+tr("子网掩码:")+entry.netmask().toString()+"\n";
            detail=detail+"\t"+tr("广播地址:")+entry.broadcast().toString()+"\n";
        }
    }
    QMessageBox::information(this,tr("Detail"),detail);
}

●QList list=QNetworkInterface:alInterfacesO: QNetwork Interface类提供了-一个主机IP地址和网络接口的列表。

●interface.name():获得网络接口的名称。

●interface.hardwareAddress():获得网络接口的硬件地址。

●interface.addressEntries()::每个网络接口包括0个或多个IP地址,每个IP地址有选择性地与一个子网掩码和(或)一个广播地址相关联。QNetworkAddressEntry类存储了被网络接口支持的一个IP地址,同时还包括与之相关的子网掩码和广播地址。

(4)运行结果如下图所示。

单击“详细”按钮后,弹出如下图所示的信息窗口。
在这里插入图片描述
在这里插入图片描述

通过上图,可以查询出本机的网络信息。

猜你喜欢

转载自blog.csdn.net/weixin_43335226/article/details/107040107
Qt5