摘要:
在应用程序开发中网络编程非常重要,目前互联网通行的TCP/IP协议,自上而下分为应用层、传输层、网际层和网络接口层这四层。
实际编写网络应用程序时只使用到传输层和应用层,所涉及的协议主要包括UDP、TCP、FTP和HTTP等。
操作系统:虽然目前主流的操作系统(Windows、Linux等)都提供了统一的套接字(Socket)抽象编程接口(API),用于编写
不同层次的网络程序,但是这种方式比较烦琐,甚至有时需要引用底层操作系统的相关数据结构,而Qt提供的网络模
块QtNetwork,圆满地解决了这一问题。
一、获取本机网络信息
在网络应用中,经常需要获得本机的主机名、IP 地址和硬件地址等网络信息。
在Qt中,需要运用QHostInfo、QNetworkInterface、 QNetwork AddresEntry等类可获得本机的网络信息。
实例分析:获取本机的网络信息。
具体实现步骤:
(1) 新建Qt Gui应用 ,选择Qt Widgets Application,项目名称为“NetworkInformation”, 基类选择“ QMainWindow”,类
名命名为“networkinformation”,勾选“创建界面”复选框的选中状态。 如下图所示。
(2)头文件“networkinformation.h” 的类声明代码如下:
class NetworkInformation : public QWidget
{
Q_OBJECT
public:
NetworkInformation(QWidget *parent = 0);
~NetworkInformation();
private:
QLabel *hostLabel;
QLineEdit *LineEditLocalHostName;
QLabel *ipLabel;
QLineEdit *LineEditAddress;
QPushButton *detailBtn;
QGridLayout *mainLayout;
};
头文件包含代码如下:
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QGridLayout>
#include <QMessageBox>
#include <QHostInfo>
#include <QNetworkInterface>
(3)源文件“networkinformation.cpp”的具体代码如下:
构造、析构函数:
NetworkInformation::NetworkInformation(QWidget *parent)
: QWidget(parent)
{
hostLabel = new QLabel(tr("主机名:"));
LineEditLocalHostName = new QLineEdit;
ipLabel = new QLabel(tr("IP 地址:"));
LineEditAddress = new QLineEdit;
detailBtn = new QPushButton(tr("详细"));
mainLayout = new QGridLayout(this);
mainLayout->addWidget(hostLabel,0,0);
mainLayout->addWidget(LineEditLocalHostName,0,1);
mainLayout->addWidget(ipLabel,1,0);
mainLayout->addWidget(LineEditAddress,1,1);
mainLayout->addWidget(detailBtn,2,0,1,2);
}
NetworkInformation::~NetworkInformation()
{
}
此时,运行结果如下图:
以上代码用于完成了NetworkInformation显示界面,下面开始实现获取本机网络信息的内容。
(1)在文件“NetworkInformation.pro” 中添加如下代码:
QT += network
(2)在头文件“networkinformation.h"中添加如下代码:
#include <QHostInfo>
#include <QNetworkInterface>
public:
void getHostInformation();
public slots:
void slotDetail();
(3)在源文件“networkinformation.cpp"中添加代码。其中,在构造函数的最后添加:
getHostInformation() ;
connect (detailBtn, SIGNAL(clicked()),this, SLOT (slotDetail())) ;
getHostInformation()函数用于获得主机信息。具体实现代码如下:
void NetworkInformation::getHostInformation()
{
QString localHostName = QHostInfo::localHostName();
LineEditLocalHostName->setText(localHostName);
QHostInfo hostInfo = QHostInfo::fromName(localHostName);
QList<QHostAddress> listAddress = hostInfo.addresses();
if(!listAddress.isEmpty())
{
LineEditAddress->setText(listAddress.first().toString());
}
}
解析:
●QString localHostName = QHostInfo:;localHostNameO:获得本机主机名。QHostInfo提供了一系列有关网络信息的静态函数,可以根据主机名获得分配的IP地址,也可以根据IP地址获得相应的主机名。
●QHostInfo hostInfo = QHostInfo::fromName(localHostName):根据主机名获得相关主机信息,包括IP地址等。 QHostInfo::fromName()函 数通过主机名查找IP地址信息。
●QList listAddress = hostInfoaddresses(:获得主机的IP地址列表。
●if(!listAddress.isEmpty)…}:获得的主机IP地址列表可能为空。在不为空的情况下使用第一个IP地址。
slotDetail()函数获得与网络接口相关的信息,具体实现代码如下:
void NetworkInformation::slotDetail()
{
QString detail="";
QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();
for(int i=0;i<list.count();i++)
{
QNetworkInterface interface=list.at(i);
detail=detail+tr("设备:")+interface.name()+"\n";
detail=detail+tr("硬件地址:")+interface.hardwareAddress()+"\n";
QList<QNetworkAddressEntry> entryList=interface.addressEntries();
for(int j=0;j<entryList.count();j++)
{
QNetworkAddressEntry entry=entryList.at(j);
detail=detail+"\t"+tr("IP 地址:")+entry.ip().toString()+"\n";
detail=detail+"\t"+tr("子网掩码:")+entry.netmask().toString()+"\n";
detail=detail+"\t"+tr("广播地址:")+entry.broadcast().toString()+"\n";
}
}
QMessageBox::information(this,tr("Detail"),detail);
}
●QList list=QNetworkInterface:alInterfacesO: QNetwork Interface类提供了-一个主机IP地址和网络接口的列表。
●interface.name():获得网络接口的名称。
●interface.hardwareAddress():获得网络接口的硬件地址。
●interface.addressEntries()::每个网络接口包括0个或多个IP地址,每个IP地址有选择性地与一个子网掩码和(或)一个广播地址相关联。QNetworkAddressEntry类存储了被网络接口支持的一个IP地址,同时还包括与之相关的子网掩码和广播地址。
(4)运行结果如下图所示。
单击“详细”按钮后,弹出如下图所示的信息窗口。