网络编程
编写具有网络功能的程序就要用到Qt Network模块。该模块提供了一系列的接口用于TCP/IP编程。什么HTTP发送/接收请求啊、cookies相关的啊、DNS啊等都有对应的C++类可操作。使用network模块,需要在.pro文件中添加“QT += network”。
Qt5中所有网络相关的C++类的继承关系如下图:
1. QHostInfo
QHostInfo类为主机名查找提供了静态函数 。
QHostInfo查找与主机名关联的IP地址或与IP地址关联的主机名。 这个类提供了两个方便的静态函数:一个异步工作并在找到主机时发出信号,另一个阻塞并返回QHostInfo对象。
要异步查找主机的IP地址,调用lookupHost(),它接受主机名或IP地址、接收方对象和槽签名作为参数并返回ID。 您可以通过使用查找ID调用abortHostLookup()来中止查找。
//通过域名查找ip
QHostInfo::lookupHost("www.baidu.com",this,[](const QHostInfo& info)
{
qDebug()<<info.hostName()<<info.addresses();
});
//查找ip是否存在
QHostInfo::lookupHost("183.232.231.172",this,[](const QHostInfo& info)
{
qDebug()<<info.hostName()<<info.addresses();
});
当结果准备好时,将调用该槽。 结果存储在QHostInfo对象中。 调用addresses()获取主机的IP地址列表,调用hostName()获取所查找的主机名。
如果查找失败,error()将返回所发生的错误类型。 errorString()给出了可读的查找错误描述。
如果你想要一个阻塞查找,使用QHostInfo::fromName()函数:
QHostInfo info = QHostInfo::fromName("smtp.qq.com");
qDebug()<<info.hostName()<<info.addresses();
QHostInfo通过IDNA和Punycode标准支持国际化域名(IDNs)。
要检索本地主机的名称,请使用静态QHostInfo::localHostName()函数。
qDebug()<< QHostInfo::localHostName();
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
2. QHostAddress
QHostAddress类提供一个IP地址。
这个类以独立于平台和协议的方式保存IPv4或IPv6地址。
QHostAddress通常与QTcpSocket、QTcpServer和QUdpSocket一起使用,以连接到主机或建立服务器。
主机地址用setAddress()设置,用toIPv4Address()、toIPv6Address()或toString()检索。 可以使用protocol()检查类型。
注意:请注意QHostAddress不做DNS查找。 QHostInfo是需要的。
这个类还支持常见的预定义地址:Null、LocalHost、LocalHostIPv6、Broadcast和Any。
枚举 |
描述 |
QHostAddress::Null |
空地址对象。 相当于QHostAddress()。 参见QHostAddress: isNull()。 |
QHostAddress::LocalHost |
IPv4本地主机地址。 相当于QHostAddress(127.0.0.1)。 |
QHostAddress::localhsotIPv6 |
IPv6本地主机地址。 相当于QHostAddress(“::1”)。 |
QHostAddress::Broadcast |
IPv4广播地址。 相当于QHostAddress(“255.255.255.255”) |
QHostAddress::AnyIPv4 |
IPv4任何地址。 相当于QHostAddress(“0.0.0.0”)。 与此地址绑定的套接字只在IPv4接口上监听。 |
QHostAddress::AnyIPv6 |
IPv6任何地址。 相当于QHostAddress(“::”)。 与此地址绑定的套接字只在IPv6接口上监听。 |
QHostAddress::Any |
双栈任意地址。 与此地址绑定的套接字将侦听IPv4和IPv6接口。 |
3. QNetworkInterface
QNetworkInterface类提供了主机的IP地址和网络接口的列表。
QNetworkInterface表示一个连接到正在运行程序的主机的网络接口。 每个网络接口可以包含0个或多个IP地址,每个IP地址可选地与一个网络掩码和/或一个广播地址相关联。 这类三元组的列表可以通过addressEntries()获得。 或者,当网络掩码或广播地址或其他信息不需要时,使用方便的allAddresses()函数只获取活动接口的IP地址。
QNetworkInterface还使用hardwareAddress()报告接口的硬件地址。
并非所有操作系统都支持报告所有特性。 在所有平台中,只有IPv4地址保证被这个类列出。 其中IPv6地址列表仅支持在Windows、Linux、macOS和bsd等操作系统上使用。
- 这个方便的函数返回主机上找到的所有IP地址。
QList<QHostAddress> addrlist = QNetworkInterface::allAddresses();
for(QHostAddress addr : addrlist)
{
qDebug()<<addr.protocol()<<addr.toString();
}
- 返回主机上找到的所有网络接口的列表。 如果失败,它将返回一个没有元素的列表。
QList<QNetworkInterface> networkList = QNetworkInterface::allInterfaces();
for(auto inter : networkList)
{
if(!inter.isValid())
continue;
//输出此网络接口的名称、接口的类型、MAC地址和 在Windows上返回这个网络接口的人类可读的名称(如以太网、本地连接等)
qDebug()<<inter.name()<<inter.type()<<inter.hardwareAddress()<<inter.humanReadableName();
//输出网络接口对应的ip地址
for(auto entrys : inter.addressEntries())
{
qDebug()<<entrys.ip();
}
}
4. QNetworkAddressEntry
QNetworkAddressEntry类存储一个由网络接口支持的IP地址,以及它相关的网络掩码和广播地址。
//返回IPv4地址和子掩码相关联的广播地址
QHostAddress broadcast() const
//返回网络接口中的IPv4或IPv6地址
QHostAddress ip() const
//返回与IP地址相关联的子网掩码
QHostAddress netmask() const
5. QAbstractSocket
QAbstractSocket类提供了所有套接字类型通用的基本功能 。
QAbstractSocket是QTcpSocket和QUdpSocket的基类