QT网络编程(一)——基础知识体系

目录

引言

一、网络编程基本概念

1. TCP与UDP

2. 套接字(Socket)

二、QT网络编程核心类

1. QTcpServer

2. QTcpSocket

3. QNetworkInterface

4. QHostInfo

三、实战示例

示例1:获取本地主机名称和IP地址及所有信息

示例2:查询域名或IP地址

四、总结


引言

QT是一个跨平台的C++图形用户界面应用程序开发框架,它不仅支持GUI程序的开发,也支持非GUI程序,如控制台工具和服务器。在QT的众多功能中,网络编程是一个重要的组成部分,使得开发者能够轻松构建基于TCP/IP协议的网络应用程序。本文将详细介绍QT网络编程的知识体系,包括网络编程的基本概念、QT网络编程的核心类以及实战示例。

一、网络编程基本概念

1. TCP与UDP

  • TCP(传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手建立连接,确保数据的可靠传输。
  • UDP(用户数据报协议):是一种无连接的、不可靠的传输层协议。UDP不保证数据包的顺序和完整性,但传输速度快,适用于对实时性要求较高的应用。

2. 套接字(Socket)

套接字是网络通信的基石,它提供了一种抽象,使得不同计算机之间的应用程序可以通过网络进行通信。在QT中,网络通信主要通过套接字类实现。

二、QT网络编程核心类

请确保你的QT项目文件(.pro)中包含了网络模块的支持,这通常是通过在.pro文件中添加QT += network来实现的。这样,QT的构建系统就会知道你的项目需要使用QT的网络功能,并相应地链接必要的库。在用到相关类时需添加相关的头文件

1. QTcpServer

QTcpServer类用于创建一个TCP服务器,监听进来的连接请求,并可以处理这些连接。主要成员函数包括:

  • listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0): 监听指定地址和端口的连接请求。
  • newConnection(): 当有新的连接请求时,会发出此信号。
  • nextPendingConnection(): 返回下一个待处理的连接。

2. QTcpSocket

QTcpSocket类用于TCP客户端或服务器端的套接字编程。主要成员函数包括:

  • connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite): 连接到指定的主机和端口。
  • readyRead(): 当有新数据可读时,会发出此信号。
  • readAll(): 读取所有待处理的数据。

3. QNetworkInterface

QNetworkInterface类提供了网络接口的信息,如IP地址、子网掩码等。主要成员函数包括:

  • allAddresses(): 返回所有网络接口的地址列表。

4. QHostInfo

QHostInfo类用于查询主机名对应的IP地址信息。主要成员函数包括:

  • fromName(const QString &hostName): 异步查询主机名的IP地址信息。
  • addresses(): 返回查询到的IP地址列表。

三、实战示例

示例1:获取本地主机名称和IP地址及所有信息

  • UI界面

  • 核心代码

#include "gethostnameipinfo.h"
#include "ui_gethostnameipinfo.h"

GetHostNameIPInfo::GetHostNameIPInfo(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::GetHostNameIPInfo)
{
    ui->setupUi(this);
}

GetHostNameIPInfo::~GetHostNameIPInfo()
{
    delete ui;
}

void GetHostNameIPInfo::GetHostNameAndIPAddress() // 获取主机名称和IP地址
{
    // 获取主机名称
    QString StrLocalHostName = QHostInfo::localHostName();
    ui->lineEdit_HostName->setText(StrLocalHostName);

    // 根据主机名称获取相应的IP地址
    QString StrLocalIPAddress = "";
    QHostInfo hostinfo = QHostInfo::fromName(StrLocalHostName);
    QList<QHostAddress> ipaddresslist = hostinfo.addresses();

    if(!ipaddresslist.isEmpty())
    {
        for(int i = 0; i < ipaddresslist.size(); i++)
        {
            QHostAddress hostaddress = ipaddresslist.at(i);
            if(QAbstractSocket::IPv4Protocol == hostaddress.protocol())
            {
                StrLocalIPAddress = hostaddress.toString();
                break;
            }
        }
        ui->lineEdit_IP->setText(StrLocalIPAddress);
    }

}
void GetHostNameIPInfo::on_pushButton_GetHostNameIP_clicked()
{
    GetHostNameAndIPAddress();
}

void GetHostNameIPInfo::on_pushButton_GetHostInfo_clicked()
{
    QString StrTemp = "";
    // 返回主机所找到的所有网络接口的列表
    QList<QNetworkInterface> netlist = QNetworkInterface::allInterfaces();
    for(int i = 0; i < netlist.size(); i++)
    {
        QNetworkInterface netinterfaces = netlist.at(i);
        StrTemp += "设备名称:" + netinterfaces.name() + "\n";               // 获取设备名称
        StrTemp += "硬件地址:" + netinterfaces.hardwareAddress() + "\n";    // 获取硬件地址

        QList<QNetworkAddressEntry> entrylist = netinterfaces.addressEntries(); // 遍历每一个IP地址对应的信息
        for(int j = 0; j < entrylist.count(); j++)
        {
            QNetworkAddressEntry etry = entrylist.at(j);
            StrTemp += "IP地址:" + etry.ip().toString() + "\n";   // 获取设备IP地址
            StrTemp += "子网掩码:" + etry.netmask().toString() + "\n";    // 获取子网掩码
            StrTemp += "广播地址:" + etry.broadcast().toString() + "\n";    // 获取子网掩码
        }

    }
    ui->label_AllInfo->setText(StrTemp);
}
  • 运行结果

示例2:查询域名或IP地址

  • UI界面

  • 核心代码
#include "getdomainips.h"
#include "ui_getdomainips.h"

GetDomainIps::GetDomainIps(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::GetDomainIps)
{
    ui->setupUi(this);
}

GetDomainIps::~GetDomainIps()
{
    delete ui;
}

// 网络层协议
QString GetDomainIps::ProtocolTypeName(QAbstractSocket::NetworkLayerProtocol protocoltype)
{
    switch (protocoltype)
    {
    case QAbstractSocket::IPv4Protocol:
        return "IPv4 Protocol";
    case QAbstractSocket::IPv6Protocol:
        return "IPv6 Protocol";
    case QAbstractSocket::AnyIPProtocol:
        return "Any IP Protocol";
    default:
        return "Unknown Network Layer Protocol";
    }
}

// 获取IP地址列表
void GetDomainIps::LookupHostInfoFunc(const QHostInfo &host)
{
    QList<QHostAddress> addresslist = host.addresses();
    for(int i = 0; i < addresslist.count(); i++)
    {
        QHostAddress host = addresslist.at(i);
        ui->plainTextEdit_outputDomainIp->appendPlainText("协议类型:"+ProtocolTypeName(host.protocol()));
        ui->plainTextEdit_outputDomainIp->appendPlainText("本机IP地址:"+host.toString()+"\n");
    }
}

void GetDomainIps::on_pushButton_clear_clicked()
{
    ui->plainTextEdit_outputDomainIp->clear();
}

void GetDomainIps::on_pushButton_GetDomainIp_clicked()
{
    QString strhostname = ui->lineEdit_inputUrl->text();
    ui->plainTextEdit_outputDomainIp->appendPlainText("查询主机信息:"+strhostname+"\n");
    QHostInfo::lookupHost(strhostname,this,SLOT(LookupHostInfoFunc(QHostInfo)));
}
  • 运行结果

四、总结

通过本篇文章,你已经基本了解了QNetworkInterface和QHostInfo两个类及其核心成员函数的使用,可以自己动手实战一下,后面将持续介绍Qt中TCP协议和UDP协议的工作原理及实战!!!

传送门1:QT网络编程(二)——TCP协议工作原理及实战

传送门2:QT网络编程(三)——UDP协议工作原理及实战

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值