qt udp通信_Qt之网络编程主机信息查询
点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获 Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP、FTP等普通网络协议的高级类如 QNetworkRequest, QN...
点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达
想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获
Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP、FTP等普通网络协议的高级类如 QNetworkRequest, QNetworkReply 和QNetworkAccessManager。Qt 网络模块还提供用于网络代理、网络承载管理的类,提供基于安全套接字层(Secure Sockets Layer, SSL)协议的安全网络通信的类。 要在程序中使用Qt网络模块,需要在项目中配置Network模块

1主机信息查询 1.1 QHostlnfo 和 QNetworklnterface 类 查询一个主机的MAC地址或IP地址是网络应用程序中经常用到的功能,Qt提供了 QHostlnfo和QNetworklnterface类可以用于此类信息的查询。QHostlnfo的静态函数localHostName()可获取本机的主机名,静态函数fromName()可以通过主机名获取IP地址,静态函数lookuPHost()可以通过一个主机名,以异步方式查找这个主机的IP地址 QHostlnfo的主要函数如下
-
QList addresses()
-
返回与hostName()主机关联的IP地址列表
-
-
HostInfoError error()
-
如果主机查找失败,返回失败类型
-
-
QString errorString()
-
如果主机查找失败,返回错误描述字符串
-
-
QString hostName()
-
返回通过IP查找的主机的名称
-
-
int lookupld()
-
返回本次查找的ID
-
-
void abortHostLookup(int id)
-
中断主机查找
-
-
QHostlnfo fromName(QString &name)
-
返回指定的主机名的IP地址
-
-
QString localDomainName()
-
返回本机DNS域名
-
-
QString localHostName()
-
返回本机主机名
-
-
int lookupHost(QString &name, QObject receiver, char *member)
-
以异步方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于ahortHostlookup()
-
QNetworklnterface可以获得运行应用程序的主机的所有IP地址和网络接口列表。静态函数alllnterfaces()返回主机上所有的网络接口的列表,一个网络接口可能包括多个的丨P地址,每个IP地址与掩码或广播地址关联。如果无需知道子网掩码和广播的IP地址,使用静态函数allAddresses()可以获得主机上的所有IP地址列表。
-
QList addressEntries()
-
返回该网络接口(包括子网掩码和广播地址)的ip地址列表
-
-
QString hardwareAddress()
-
返回该接口的低级硬件地址,以太网里就是MAC地址
-
-
QString humanReadableName()
-
返回可以读懂的接口名称,如果名称不确定,得到的就是name()函数的返回值
-
-
bool isValid()
-
如果接口信息有效就返回true
-
-
QString name()
-
返回网络接口名称
-
-
QList allAddresses()
-
返回主机上所有IP地址的列表
-
-
QList alllnterfaces()
-
返回主机上所有接口的网络列表
-
实例如下:

头文件
#pragma once#include #include "ui_QGuiInternet.h"#include class QGuiInternet : public QWidget{ Q_OBJECTpublic: QGuiInternet(QWidget *parent = Q_NULLPTR); ~QGuiInternet();private: Ui::QGuiInternet ui; //通过协议类型返回协议名称 QString protocolName(QAbstractSocket::NetworkLayerProtocol protocol);private slots: void lookedUpHostInfo(const QHostInfo& host); void btnGetHostInfo_clicked();//获取本机主机名和IP地址 void btnDetail_clicked(); void btnALLInterface_clicked(); void btnLookup_clicked(); //查找域名的IP地址 void btnClear_clicked();//清空文本}
源文件
#include "QGuiInternet.h"#include #pragma execution_character_set("utf-8")QGuiInternet::QGuiInternet(QWidget *parent) : QWidget(parent){ ui.setupUi(this); connect(ui.btnGetHostInfo, SIGNAL(clicked()), this, SLOT(btnGetHostInfo_clicked())); connect(ui.btnDetail, SIGNAL(clicked()), this, SLOT(btnDetail_clicked())); connect(ui.btnALLInterface, SIGNAL(clicked()), this, SLOT(btnALLInterface_clicked())); connect(ui.btnLookup, SIGNAL(clicked()), this, SLOT(btnLookup_clicked())); connect(ui.btnClear, SIGNAL(clicked()), this, SLOT(btnClear_clicked()));}QGuiInternet::~QGuiInternet(){}//通过协议类型返回协议名称QString QGuiInternet::protocolName(QAbstractSocket::NetworkLayerProtocol protocol){ switch (protocol) { 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"; }}void QGuiInternet::lookedUpHostInfo(const QHostInfo& host){ //查找主机信息的槽函数 QList addList = host.addresses(); if (!addList.isEmpty()) { for (int i = 0; i < addList.count(); i++) { QHostAddress aHost = addList.at(i); //每一项是一个QHostAddress bool show = ui.chkOnlyIPv4->isChecked();//只显示IPv4 if (show) show = (QAbstractSocket::IPv4Protocol == aHost.protocol()); //协议类型, else show = true; if (show) { ui.plainTextEdit->appendPlainText("协 议:" + protocolName(aHost.protocol()));//协议类型 ui.plainTextEdit->appendPlainText(aHost.toString()); //IP地址 } } }}//获取本机主机名和IP地址void QGuiInternet::btnGetHostInfo_clicked(){ QString hostName = QHostInfo::localHostName();//本地主机名 ui.plainTextEdit->appendPlainText("本地主机名:" + hostName + "\n"); QHostInfo hostInfo = QHostInfo::fromName(hostName);//本地IP地址 QList addList = hostInfo.addresses();//IP地址列表 if (!addList.isEmpty()) { for (int i = 0; i < addList.count(); i++) { QHostAddress aHost = addList.at(i); //每一项是一个QHostAddress bool show = ui.chkOnlyIPv4->isChecked();//只显示IPv4 if (show) show = (QAbstractSocket::IPv4Protocol == aHost.protocol()); //协议类型, else show = true; if (show) { ui.plainTextEdit->appendPlainText("协 议:" + protocolName(aHost.protocol()));//协议类型 ui.plainTextEdit->appendPlainText("本机IP地址:" + aHost.toString()); //IP地址 ui.plainTextEdit->appendPlainText(""); } } }}void QGuiInternet::btnDetail_clicked(){ QList addList = QNetworkInterface::allAddresses();// if (!addList.isEmpty()) { for (int i = 0; i < addList.count(); i++) { QHostAddress aHost = addList.at(i); bool show = ui.chkOnlyIPv4->isChecked();//只显示IPv4 if (show) show = (QAbstractSocket::IPv4Protocol == aHost.protocol()); else show = true; if (show) { ui.plainTextEdit->appendPlainText("协 议:" + protocolName(aHost.protocol())); ui.plainTextEdit->appendPlainText("IP地址:" + aHost.toString()); ui.plainTextEdit->appendPlainText(""); } } }}void QGuiInternet::btnALLInterface_clicked(){ QListlist = QNetworkInterface::allInterfaces(); for (int i = 0; i < list.count(); i++) { QNetworkInterface aInterface = list.at(i); if (!aInterface.isValid()) continue; ui.plainTextEdit->appendPlainText("设备名称:" + aInterface.humanReadableName()); ui.plainTextEdit->appendPlainText("硬件地址:" + aInterface.hardwareAddress()); QList entryList = aInterface.addressEntries(); for (int j = 0; j < entryList.count(); j++) { QNetworkAddressEntry aEntry = entryList.at(j); ui.plainTextEdit->appendPlainText(" IP 地址:" + aEntry.ip().toString()); ui.plainTextEdit->appendPlainText(" 子网掩码:" + aEntry.netmask().toString()); ui.plainTextEdit->appendPlainText(" 广播地址:" + aEntry.broadcast().toString() + "\n"); } ui.plainTextEdit->appendPlainText("\n"); }}//查找域名的IP地址void QGuiInternet::btnLookup_clicked(){ //查找主机信息 QString hostName = ui.editHost->text();//主机名 ui.plainTextEdit->appendPlainText("正在查找查找主机信息:" + hostName); QHostInfo::lookupHost(hostName, this, SLOT(lookedUpHostInfo(QHostInfo)));}//清空文本void QGuiInternet::btnClear_clicked(){ ui.plainTextEdit->clear();}
更多推荐



所有评论(0)