Qt 网络编程实战

一.获取主机的网络信息

  1. 需要添加network模块
QT   += core gui network
  1. 主要涉及的类分析

QHostInfo类

  • QHostInfo::localHostName() 获取本地的主机名
  • QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口

QNetworkInterface类

  • QNetworkInterface::allAddresses() 网卡所有的IP地址
  1. 项目效果

在这里插入图片描述

  1. 源码如下
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QHostInfo>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots://获取主机名void GetHostName();//获取IPV4void GetIPV4();//获取IPV6void GetIPV6();//清除文本内容void Clear_Text();//获取指定域名的IP地址void Get_DefineHost();void lookedUp(QHostInfo hostInfo);//主机所有网卡IP地址void GetAlladdresses();//所有网卡的网络信息void GetNetWorkInfo();private:void InitConnectSignals();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QHostInfo>
#include<QNetworkInterface>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("主机的网络信息");InitConnectSignals();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::GetHostName()
{//获取当前的主机名QString hostname = QHostInfo::localHostName();ui->textEdit->append("当前的主机名为:"+hostname);}void MainWindow::GetIPV4()
{//获取当前的主机名QString hostname = QHostInfo::localHostName();//获取指定主机的主机信息QHostInfo hostinformation = QHostInfo::fromName(hostname);//Returns the list of IP addresses associated with hostName().//This list may be empty.//返回与hostName()相关联的IP地址列表。//该列表可能为空。QList<QHostAddress> addrlist = hostinformation.addresses();ui->textEdit->append("本机的IPV4地址如下:");if(!addrlist.isEmpty()){//for遍历输出for(int i=0;i<addrlist.size();i++){//protocol是协议的意思if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol){ui->textEdit->append(addrlist[i].toString());}}}}void MainWindow::GetIPV6()
{//获取当前的主机名QString hostname = QHostInfo::localHostName();//获取指定主机的主机信息QHostInfo hostinformation = QHostInfo::fromName(hostname);//Returns the list of IP addresses associated with hostName().//This list may be empty.//返回与hostName()相关联的IP地址列表。//该列表可能为空。QList<QHostAddress> addrlist = hostinformation.addresses();ui->textEdit->append("本机的IPV6地址如下:");if(!addrlist.isEmpty()){//for遍历输出for(int i=0;i<addrlist.size();i++){//protocol是协议的意思if(addrlist[i].protocol()==QAbstractSocket::IPv6Protocol){ui->textEdit->append(addrlist[i].toString());}}}
}void MainWindow::Clear_Text()
{ui->textEdit->clear();
}void MainWindow::Get_DefineHost()
{//获取lineEdit上的域名QString hostName =ui->lineEdit->text();if(hostName.isEmpty()){return ;}//获取域名的IPV4信息/*查找与主机名name相关联的IP地址,并返回用于查找的ID。当查找结果准备好时,
将使用QHostInfo参数调用receiver中的slot或信号成员。然后可以检查QHostInfo对象以获得查找结果。*///lookupHost(const QString &name, QObject *context, Func1 slot)QHostInfo::lookupHost(hostName,this,SLOT(lookedUp(QHostInfo)));
}void MainWindow::lookedUp(QHostInfo hostInfo)
{//当前的主机名QString hostName=hostInfo.hostName();ui->textEdit->append("当前域名为:"+hostName+" IPV4信息如下:");QList<QHostAddress> addrlist = hostInfo.addresses();if(!addrlist.isEmpty()){for(int i=0;i<addrlist.count();i++){if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol){ui->textEdit->append(addrlist[i].toString());}}}/*常见的错误
QObject::connect: Incompatible sender/receiver argumentsQHostInfoResult::resultsReady(QHostInfo) --> MainWindow::lookedUp(QHostInfo&)信号和槽的参数不匹配*/
}void MainWindow::GetAlladdresses()
{//获取网卡的所有IP信息ui->textEdit->append("所有网卡的IPV4信息如下:");QList<QHostAddress>addrlist = QNetworkInterface::allAddresses();if(!addrlist.isEmpty()){for(int i=0;i<addrlist.count();i++){if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol){ui->textEdit->append(addrlist[i].toString());}}}}void MainWindow::GetNetWorkInfo()
{//获取所有网卡的网络信息QList<QNetworkInterface>list =QNetworkInterface::allInterfaces();for(int i=0;i<list.count();i++){QNetworkInterface interface = list[i];if(!interface.isValid()){continue;}ui->textEdit->append("设备名称:"+interface.humanReadableName());ui->textEdit->append("硬件地址:"+interface.hardwareAddress());//一个网卡,可以有多个IP地址QList<QNetworkAddressEntry> list2 = interface.addressEntries();for(int j=0; j<list2.count(); j++){QNetworkAddressEntry entry = list2[j];ui->textEdit->append("\tIP地址:" + entry.ip().toString());ui->textEdit->append("\t子网掩码:" + entry.netmask().toString());ui->textEdit->append("\t广播地址: " + entry.broadcast().toString() + "\n");}}}void MainWindow::InitConnectSignals()
{//void pressed();connect(ui->pushButton_HostName,SIGNAL(pressed()),this,SLOT(GetHostName()));connect(ui->pushButton_IPV4,SIGNAL(pressed()),this,SLOT(GetIPV4()));connect(ui->pushButton_IPV6,SIGNAL(pressed()),this,SLOT(GetIPV6()));connect(ui->pushButton_Clear,SIGNAL(pressed()),this,SLOT(Clear_Text()));connect(ui->pushButton_DefineHost,SIGNAL(pressed()),this,SLOT(Get_DefineHost()));connect(ui->pushButton_Alladdresses,SIGNAL(pressed()),this,SLOT(GetAlladdresses()));connect(ui->pushButton_Network,SIGNAL(pressed()),this,SLOT(GetNetWorkInfo()));
}

二.TCP编程

1. server编程

  • 项目效果
    在这里插入图片描述

  • 客户端
    在这里插入图片描述

  • 项目源码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QHostInfo>
#include<QTcpSocket>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);InitUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow:: InitUI()
{//先处理combox中的主机的IP信息,使用的是IPV4QString localHostName = QHostInfo::localHostName();QHostInfo hostInformation = QHostInfo::fromName(localHostName);//主机的IP地址QList<QHostAddress> addrlist = hostInformation.addresses();if(!addrlist.isEmpty()){for(int i=0;i<addrlist.count();i++){if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol){ui->comboBox->addItem(addrlist[i].toString());}}}//处理tcp通信tcpserver=new QTcpServer(this);//发现新信号就触发onNewConnection//每次有新的连接时,他的信号就会发出。connect(tcpserver,SIGNAL(newConnection()),this,SLOT(onNewConnection()));}void MainWindow:: onNewConnection()
{//创建新的连接时,就会触发这个函数//创建一个新的套接字来对客户端进行服务/*
将下一个挂起的连接作为已连接的QTcpSocket对象返回。
套接字是作为服务器的子节点创建的,这意味着当QTcpServer对象被销毁时,
它将被自动删除。在使用完对象后显式删除它仍然是一个好主意,以避免浪费内存。
如果在没有挂起连接的情况下调用此函数,则返回Nullptr*/tcpsocket=tcpserver->nextPendingConnection();//连接成功会触发的connect(tcpsocket,SIGNAL(connected()),this,SLOT(onConnected()));//当有数据可以读的时候,我们就读数据,(使用信号槽)connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(onDisconnected()));// void stateChanged(QAbstractSocket::SocketState);connect(tcpsocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));}void MainWindow::onConnected()
{//刚连入成功ui->plainTextEdit->appendPlainText("\n客户端请求已经接入!");//获取客户端的地址信息ui->plainTextEdit->appendPlainText("客户端地址:"+tcpsocket->peerAddress().toString());ui->plainTextEdit->appendPlainText("客户端端口号:"+QString::number(tcpsocket->peerPort()));
}void MainWindow::onSocketReadyRead()
{//有数据可读时while(tcpsocket->canReadLine()){ui->plainTextEdit->appendPlainText("[收到]"+tcpsocket->readLine());}
}void MainWindow::on_actionListen_triggered()
{//监听需要IP地址和端口号QString IP=ui->comboBox->currentText();QHostAddress addr(IP);quint16 port=ui->spinBox->value();//开始监听tcpserver->listen(addr,port);ui->plainTextEdit->appendPlainText("开始监听,等待客户端发起连接...");ui->plainTextEdit->appendPlainText("服务器地址:"+tcpserver->serverAddress().toString());ui->plainTextEdit->appendPlainText("服务器端口:"+QString::number(tcpserver->serverPort()));//更改控件ui->actionStop->setEnabled(true);ui->actionListen->setEnabled(false);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python——面向对象编程(类和对象)2

目录 私有属性和私有方法 01.应用场景及定义方式 02.伪私有属性和私有方法 继承 1.1继承的概念、语法和特点 1.继承的语法&#xff1a; 2.专业术语&#xff1a; 3.继承的传递性 1.2方法的重写 1.覆盖父类的方法 2.对父类方法进行扩展 关于super 1.3 父类的私有属性和…

一天搞定Echarts可视化!(1)——伪类的学习

在下面的课程当中&#xff0c;伪类是经常被使用到的一项css技术。所以这我们先进行伪类的学习来作为本次Echarts课程的前置知识。 认识“&” 在css中&#xff0c;“&”符号通常用于选择器中&#xff0c;表示选择某个元素的子元素或特定状态下的元素。 伪类 :hover—…

PID与PPID

参考文章&#xff1a;https://blog.csdn.net/oh_coding/article/details/128865229 PID (process ID)&#xff1a; 进程PID是当操作系统运行进程时系统自动为其分配的标识符&#xff0c;具有唯一性&#xff0c;且为非零整数。一个PID只会标识一个进程。一旦被发放将会是终生标识…

机械拆装-基于Unity-装配功能的实现

目录 1. 装配场景的相机控制 2. 鼠标拖拽和旋转功能的实现 2.1 鼠标拖拽 2.2 物体旋转 3. 零件与装配位置的对应关系 4. 轴向装配的准备位置 5. 装配顺序的实现 5.1 标签提示 5.2 定义一个变量记录步骤数值 1. 装配场景的相机控制 开始装配功能时&#xff0c;需要将相机调…

在大型项目中,怎样有效地组织和管理 SCSS 文件结构以提高开发效率?

在大型项目中&#xff0c;组织和管理 SCSS 文件结构是非常重要的&#xff0c;可以提高开发效率和代码的可维护性。下面是一些有效的方法&#xff1a; 使用模块化和层次化的文件结构&#xff1a;将 SCSS 文件按照模块进行组织&#xff0c;每个模块包含相关的样式规则。可以使用文…

vector与list的简单介绍

1. 标准库中的vector类的介绍&#xff1a; vector是表示大小可以变化的数组的序列容器。 就像数组一样&#xff0c;vector对其元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素&#xff0c;并且与数组中的元素一样高效。但与数…

1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码

一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统&#xff0c;结合react.js框架和node.js后端完成本系统&#xff0c;对理解react node编程开发语言有帮助系统采用node框架&#xff08;前后端分离&#xff09;&#xff09;&#xff0c;系统具有完整的源…

【代码随想录训练营】【Day 63】【单调栈-2】| Leetcode 42, 84

【代码随想录训练营】【Day 63】【单调栈-2】| Leetcode 42, 84 需强化知识点 单调栈强化 题目 42. 接雨水 注意 python 数组反序用法 result [::-1] class Solution:def trap(self, height: List[int]) -> int:# n len(height)# leftMax, rightMax [0] * n, [0] * …

golang 垃圾回收

gc不回收什么 GC 不负责回收栈中的内存栈是一块专用内存&#xff0c;专门为了函数执行而准备的&#xff0c;存储着函数中的局部变量以及调用栈栈中的数据可以通过简单的编译器指令自动清理&#xff0c;也就不需要通过 GC 来回收了 垃圾回收算法 主流的两类垃圾回收算法有两种&a…

Spring Boot中的安全漏洞防护

Spring Boot中的安全漏洞防护 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中有效防护安全漏洞。随着软件应用程序的复杂…

6种ETL计算引擎介绍

目录 一、ETL计算引擎定义 二、ETL计算引擎的功能和特性 三、6种ETL计算引擎 1、MapReduce 2、Tez 3、Spark 4、Flink 5、ClickHouse 6、Doris 一、ETL计算引擎定义 ETL&#xff08;Extract, Transform, Load&#xff09;计算引擎是用于执行ETL过程中数据转换阶段的关键组件之一…

mac如何压缩视频大小不改变画质,mac怎么压缩视频软件

在数字时代&#xff0c;视频已成为信息传递和娱乐消遣的重要媒介。然而&#xff0c;视频带来的愉悦体验背后&#xff0c;是日益增长的存储和分享压力。大视频文件不仅占用大量存储空间&#xff0c;上传和下载也变得异常缓慢。那么&#xff0c;如何才能有效压缩视频&#xff0c;…

ERROR: No matching distribution found for numpy

1.原因&#xff1a; 出现这两行英文是因为原先输入pip install numpy的方式不安全&#xff0c;不被信任所以无法下载。 2.解决方法&#xff1a; 改成以下命令执行&#xff1a; pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun…

2025年中国国际新能源汽车技术零部件及服务展览会

中国国际新能源汽车技术零部件及服务展览会&#xff0c;从设计到制造、从使用到服务&#xff0c;精准“链”接新能源汽车全产业链的技术供应商和汽车制造商&#xff0c;专业面向新能源造车供应链的行业盛会。2024展会回顾&#xff1a;在展会的3天里&#xff0c;有62家车企核心供…

共享拼购:创新商业模式引领小用户基数下的销售奇迹“

在瞬息万变的商业蓝海中&#xff0c;一个新颖且深具潜力的策略正悄然改变着游戏规则&#xff0c;它巧妙地避开了传统路径的束缚&#xff0c;以微妙却深远的调整&#xff0c;开辟出了一条通往成功的独特航道。我的一位合作伙伴&#xff0c;正是这一策略的实践者&#xff0c;他在…

数据库设计(实战项目)-1个手机号多用户身份

一. 背景&#xff1a; 该需求是一个互联网医院的预约单场景&#xff0c;护士在小程序上申请患者查房预约单&#xff0c;医生在小程序上对预约单进行接单&#xff0c;护士开始查房后填写查房小结&#xff0c;客户需要对用户信息进行授权&#xff0c;医生查房后进行签字&#xff…

数字媒体技术基础之:DNG 文件

DNG&#xff08;Digital Negative&#xff09;文件是一种用于存储原始图像数据的文件格式&#xff0c;由 Adobe Systems 于2004年开发并推广。DNG 是一种开放的、非专利的原始图像格式&#xff0c;旨在为不同相机制造商提供一个统一的存储格式。DNG 文件保存了原始的、未处理的…

springboot+vue下载文件一篇就够了

前台代码 export function downLoad(id) {var url = baseURL + `/api/admin/system/promotion/downLoad/${id}`axios({method: get,url: url,responseType: blob,headers: { Authori-Zation: getToken() }}).then(async (res) => {// 从 Content-Disposition 头部解析文件名…

C++时区转换

#include <iostream> #include "cctz/civil_time.h" #include "cctz/time_zone.h"// 时区转换库 // https://github.com/google/cctzint test() {for (cctz::civil_day d(2016, 2, 1); d < cctz::civil_month(2016, 3); d) {std::cout << &…

【设计模式】设计模式学习线路与总结

文章目录 一. 设计原则与思想二. 设计模式与范式三. 设计模式进阶四. 项目实战 设计模式主要是为了改善代码质量&#xff0c;对代码的重用、解耦以及重构给了最佳实践&#xff0c;如下图是我们在掌握设计模式过程中需要掌握和思考的内容概览。 一. 设计原则与思想 面向对象编…