Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的 QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP、FTP等普通网络协议的高级类如QNetworkRequest,QNetworkReply和QNetworkAccessManager。
Qt网络模块还提供用于网络代理、网络承载管理的类,提供基于安全套接字层(Secure Sockets Layer,SSL)协议的安全网络通信的类。
要在程序中使用Qt网络模块,需要在项目配置文件中增加一条配置语句:
Qt += network
QHostlnfo类的功能
查询一个主机的IP地址是网络应用程序中常常用到的功能,Qt提供了 QHostlnfo类可以用于此类信息的查询。
QHostlnfo的静态函数localHostName()可获取本机的主机名,静态函数fromName()可以通过主机名获取IP地址,静态函数lookupHost()可以通过一个主机名,以异步方式查找这个主机的IP地址。下面是QHostlnfo类主要的功能函数(省略了函数中的const关键字)。
- 公共函数
- QList<QHostAddress> addresses() 返回与hostName()主机关联的IP地址列表
- HostlnfoError error() 如果主机查找失败,返回失败类型
- QString errorString() 如果主机查找失败,返回错误描述字符串
- QString hostName() 返回通过IP查找的主机的名称
- int lookupId() 返回本次查找的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,可用于abortHostLookup()
使用QHostlnfo显示本机地址信息
为演示QHostlnfo类的主要功能,创建一个窗口基于QWidget的应用程序,实例运行时界面如图所示。对话框界面由UI设计器设计,主要代码都是各按钮的clicked()信号的槽函数。

窗口上的“获取本机主机名”和“获取本机IP地址”按钮的响应代码如下:
void Widget::on_btnGetHostName_clicked()
{ //QHostInfo获政主机信息
QString hostName=QHostInfo::localHostName(); //本地主机名
ui->plainTextEdit->appendPlainText ("本机主机名:"+hostName+"
");
}
void Widget::on_btnGetIPAddress_clicked()
{
QString hostName=QHostInfo::localHostName(); //本地主机名
QHostInfo hostInfo=QHostInfo::fromName(hostName); //本机 IP 地址
QList<QHostAddress> 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()); //IPv4 协议
else
show=true;
if (show){
ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机 IP 地址:"+aHost.toString ());
ui->plainTextEdit->appendPlainText("");
}
}
}
}
这段代码先通过静态函数QHostInfo::localHostName()获取本机主机名hostName,然后再使用主机名作为参数,用静态函数QHostInfo::fromName(hostName)获取主机的信息hostlnfo。 hostlnfo是QHostlnfo类的实例,通过其函数addresses()获取主机的IP地址列表。
QList<QHostAddress> addList=hostInfo.addresses();
返回的addList是QHostAddress类的列表,QHostAddress类提供一个IP地址的信息,包括IPv4地址和IPv6地址。QHostAddress有以下两个主要的函数。
- protocol()返回QAbstractSocket::NetworkLayerProtocol 类型变量,表明当前 IP 地址的协议类型。QAbstractSocket::NetworkLayerProtocol 枚举类型的取值如下。
- QAbstractSocket::IPv4Protocol IPv4
- QAbstractSocket::IPv6Protocol IPv6
- QAbstractSocket::AnyIPProtocol IPv4或IPv6
- QAbstractSocket::UnknownNetworkLayerProtocol 其他类型
- toString ()返回IP地址的字符串,
程序中显示了IP地址列表中每个IP地址的协议类型和IP地址字符串。为根据 protocol()返回的
QAbstractSocket::NetworkLayerProtocol 枚举值显示协议名称字符串,自定义了一个函数protocolName(),代码如下:
QString Widget::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";
}
}
单击“获取本机IP地址”按钮,如果勾选了“只显示IPv4协议地址” 复选框,就只显示本机的IPv4地址,否则显示所有IP地址信息。
使用QHostlnfo查找主机地址信息
QHostlnfo的静态函数lookupHost()可以根据主机名、域名或IP地址查找主机的地址信息, lookupHost()函数原型如下:
int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)
输入参数name是表明主机名的字符串,可以是一个主机名、一个域名,或者是一个IP地址。 lookupHost()以异步方式查找主机地址,参数receiver和member指定一个响应槽函数的接收者和槽函数名称。
执行lookupHost()后,程序可能需要花必定时间来查找主机地址,但不会阻塞程序的运行。
当查找到主机地址后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。函数返回一个表明查找的ID。
图中的“查找域名的IP地址”按钮的槽函数及lookupHost()函数关联槽函数代码如下:
void Widget::on_btnLookUp_clicked()
{//查找主机信息
QString hostname=ui->edtHost->text(); //主机名
ui->edtLookUp->appendPlainText ("正在查找主机信息:"+hostname);
QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostlnfo(QHostInfo)));
}
void Widget::lookedUpHostlnfo(const QHostInfo &host)
{//查找主机信息的槽函数
QList<QHostAddress> addList=host.addresses();
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->edtLookUp->appendPlainText("协议:"+protocolName(aHost.protocol()));
ui->edtLookUp->appendPlainText(aHost.toString());
}
}
}
}
————————————————
觉得有用的话请关注点赞,谢谢您的支持!
对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!



加油
谢谢