学习目的:网络信息获取操作
前置环境
运行环境:qt creator 4.12
学习内容
一、Qt 网络编程基础
- Qt 直接提供了网络编程模块,包括基于 TCP/IP 的客户端和服务器相关类,如 QTcpSocket/QTcpServer 和 QUdpSocket,以及实现 HTTP、FTP 等协议的高级类,如 QNetworkRequest/QNetworkAccessManager。
- Qt 网络编程模块还提供了基于安全套接字层协议(SSL)的安全网络通讯类。
- 开发过程中必要在项目配置文件中添加 QT += network 以引入网络模块。
- QHostInfo 类提供了查询主机名、IP 地点、DNS 域名等信息的静态函数。
- QNetworkInterface 类用于获取主机所有 IP 地点和网络接口列表信息
QHostInfo类提供了一些常用的成员函数,用于获取主机名和IP地点等信息。以下是一些常用的成员函数:
- QHostInfo.localHostName(): 返回当前主机的主机名。
- QHostInfo.localDomainName(): 返回当前主机的域名。
- QHostInfo.addresses(): 返回与主机名关联的所有IP地点列表。
- QHostInfo.lookupHost(const QString &hostname, QObject *receiver, const char *member): 异步查找指定主机名对应的IP地点列表,当查找完成时会发送一个finished()信号。
- QHostInfo::fromName(const QString &name): 同步查找指定主机名对应的IP地点列表,返回一个QHostInfo对象。
- QHostInfo.error(): 返回近来一次查找操作中发生的错误。
- QHostInfo.errorString(): 返回近来一次查找操作中发生的错误形貌。
- QHostInfo.addLookup(const QString &hostname): 添加一个新的主机名查找任务。
- QHostInfo.cancelAllLookups(): 取消所有正在举行的主机名查找任务。
QNetworkInterface是Qt中用于获取网络接口信息的类,它提供了以下一些常用的成员函数:
- QList<QNetworkInterface> allInterfaces(): 返回系统中所有可用的网络接口列表。
- QList<QNetworkAddressEntry> addressEntries(): 返回当前网络接口的所有IP地点条目。
- QString name(): 返回网络接口的名称。
- QString humanReadableName(): 返回更加易读的网络接口名称。
- QNetworkInterface::InterfaceFlags flags(): 返回网络接口的标志位,用于表示接口的状态和特性。
- quint16 index(): 返回网络接口的索引号。
- QNetworkAddressEntry address(): 返回网络接口的主IP地点。
- QList<QNetworkAddressEntry> allAddresses(): 返回网络接口的所有IP地点条目。
- quint64 hardwareAddress(): 返回网络接口的MAC地点。
- bool isValid(): 检查网络接口是否有用。
- bool isLoopBack(): 检查网络接口是否为回环接口。
- bool isPointToPoint(): 检查网络接口是否为点对点连接。
实现项目
1.通过域名查询对方主机ip
这里出现两个ip是由于百度举行了ip转发
2.本机网络信息获取
Qt获取网络信息编程
1.本机网络信息获取
- #include "dialog.h"
- #include "ui_dialog.h"
- Dialog::Dialog(QWidget *parent)
- : QDialog(parent)
- , ui(new Ui::Dialog)
- {
- ui->setupUi(this);
- }
- Dialog::~Dialog()
- {
- delete ui;
- }
- void Dialog::on_pushButton_2_clicked() //获取ip/主机名称
- {
- QString localname = QHostInfo::localHostName();
- ui->lineEdit->setText(localname);
- QHostInfo info = QHostInfo::fromName(localname);
- QList<QHostAddress> ipaddr = info.addresses();
- foreach(const QHostAddress& addr,ipaddr)
- {
- if(addr.protocol() == QAbstractSocket::IPv4Protocol){
- qDebug()<<"IPv4 address:"<<addr.toString();
- ui->lineEdit_2->setText(addr.toString());
- }else if(addr.protocol() == QAbstractSocket::IPv6Protocol){
- qDebug()<<"IPv6 address:"<<addr.toString();
- }
- }
- }
- void Dialog::on_pushButton_clicked() //获取详细信息
- {
- //枚举所有的网络接口,然后获取每个接口的IP地址条目,同样区分IPv4和IPv6地址进行输出。
- QList<QNetworkInterface> netinterface = QNetworkInterface::allInterfaces();
- QString result;
- for (int i=0;i<netinterface.size();i++) { //遍历所有网络接口
- QNetworkInterface interface=netinterface.at(i);
- result+="设备名称:"+interface.name()+"\n"; // 返回网络接口的名称,如"以太网"或"WLAN"等。
- result+="硬件地址:"+interface.hardwareAddress()+"\n"; //获取当前网络接口的硬件地址(MAC地址),
- //从当前网络接口获取所有的地址条目列表。 QNetworkAddressEntry 表示一个IP地址条目,包含IP地址、子网掩码和广播地址等信息。
- QList<QNetworkAddressEntry> entrylist = interface.addressEntries();
- for (int k=0;k<entrylist.size();k++) {
- QNetworkAddressEntry etry =entrylist.at(k);
- result+="Ip地址:"+etry.ip().toString()+"\n";
- result+="子网掩码:"+etry.netmask().toString()+"\n";
- result+="广播地址:"+etry.broadcast().toString()+"\n";
- }
- }
- qDebug()<<"网卡接口全部信息:"<<result;
- QTextEdit *set =new QTextEdit(result,this);
- ui->verticalLayout_3->addWidget(set);
- }
复制代码 2.通过域名查询对方主机ip
- #include "dialog.h"
- #include "ui_dialog.h"
- Dialog::Dialog(QWidget *parent)
- : QDialog(parent)
- , ui(new Ui::Dialog)
- {
- ui->setupUi(this);
- }
- Dialog::~Dialog()
- {
- delete ui;
- }
- void Dialog::on_pushButton_2_clicked() //查询dns
- {
- QString name =ui->lineEdit->text();
- ui->plainTextEdit->appendPlainText("正在查询的主机信息:"+name);
- QHostInfo info =QHostInfo::fromName(name);
- QList<QHostAddress> addrs = info.addresses();
- for (int i=0;i<addrs.size();i++) {
- QHostAddress addr =addrs.at(i);
- QString proto;
- switch (addr.protocol()) {
- case QAbstractSocket::IPv4Protocol:
- proto+= "IPv4 Protocol";break;
- case QAbstractSocket::IPv6Protocol:
- proto+= "IPv6 Protocol";break;
- case QAbstractSocket::AnyIPProtocol:
- proto+= "Any IP Protocol";break;
- default:
- proto+= "Unknown Network Layer Protocol";
- }
- ui->plainTextEdit->appendPlainText("协议类型:"+proto);
- ui->plainTextEdit->appendPlainText("主机IP地址: "+addr.toString());
- }
- }
- void Dialog::on_pushButton_clicked() //清空
- {
- ui->plainTextEdit->clear();
- }
复制代码 总结
盘算机ip信息获取,重要通过name 交由QhostInfo,然后通过info 获取addr等信息,之后遍历ip表即可获得。
最后附上源代码链接
对您有帮助的话,帮忙点个star
32-networkinfo · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)
33-dns-netinfo · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |