qt获取网络ip地址的类
最近在学习qt网络编程,基于tcp和udp协议。
看了一些别人的程序和qt4自带的例子,困扰我最大的问题就是获取ip的类,总结起来还挺多的。
主要介绍常用的QtNetwork Module中的QHostInfo,QHostAddress,QNetworkInterface和QNetAddressEntry等类。
1。QHostInfo类获取主机名和ip地址
(1)获取主机名: QHostInfo::localHostName()
QString localHostName=QHostInfo::localHostName();
(2)获取ip地址: QHostInfo info=QHostInfo::fromName(localHostName);//根据上边获得的主机名来获取本机的信息
info.addresses();//QHostInfo的address函数获取本机ip地址
如果存在多条ip地址ipv4和ipv6:
foreach(QHostAddressaddress,info.addresses())
{
if(address.protocol()==QAbstractSocket::IPv4P)//只取ipv4协议的地址
qDebug()<<address.toString();
}
如果是ipv6地址,可以使用QAbstractSocket::ipv6Protocol来实现。
QHostAddress类是管理ip地址的类,所有的ip都归这个类管理。
(3)以主机名获取ip
QHostInfo类可以获取任意主机名的ip,比如获取网站的ip地址,可以用lookupHost()函数来获取,他是基于信号和槽的,一旦发现ip地址就会触发槽函数。
首先定义一个槽函数:
void lookedup(const QHostInfo &host)
{
qDebug()<<host.addresses() .first().toString();//输出了第一个 ip地址
}
QHostInfo::lookupHost("www.baidu.com" ,
this,SLOT(lookedUp(QHostInfo)));
通过查询百度网址的ip地址,如果查找到,就会执行lookedUp()函数。
(4)通过ip地址获取主机名
调用lookupHost()函数,通过输入ip地址反向查找主机名。将上面的函数换掉。
2。QNetworkInterface类获取程序运行本机的ip地址和网络接口信息
QNetworkInterface类提供了程序所运行的主机ip地址和网络接口信息的列表. 在一个网络接口信息中,包含一个或多个ip地址,每一个ip地址又包含和它相关的子网掩码和广播地址.他们三者别封装在一个对象中QNetworkAddressEntry,网络接口信息也包含了硬件地址信息.
QList<QNetworkInterface>list=QNetworkInterface;:allInterfaces();//获取所有网络接口信息
foreach(QNetworkInterfaceinterface,list)
{
//便利每一个接口信息
qDebug<<"Device:"<<interface.name();//设备名称
qDebug<<"HardwareAddress:"<<interface.hardwareAdderss();//获取硬件地址
QList<QNetworkAddressEntry>entryList=interface.addressEntries();//获取ip地址和子网掩码和广播地址
foreach(QNetworkAddressEntryentry,entryList)
{//便利ip条目列表
qDebug<<"IP address:"<<entry.ip().toString();//获取ip
qDebug<<"Netmask:"<<entry.netmask().toString();//获取子网掩码
qDebug<<"Broadcast:"<<entry.broadcast().toString();//获取广播地址
}
}
如果只想获取ip地址可以调用QNetworkInterface类的allAddresses()来获取ip地址,如:
QStringaddress=QNetworkInterface::allAddresses().first().toString();
获取所有ip地址:
QList<QHostAddress>list=QNetworkInteface::allAddresses();
{
foreach(QHostAddressaddress,list)
{
if(address.protocol()==QAbstractSocket::ipv4protocol)
qDebug<<address.toString();
}
}
http://blog.csdn.net/cateatapple/article/details/40824871
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2015-08-09 Delphi与Java中的日期互换
2015-08-09 QT变异版本下载(SJLJ长跳转,DWARF不传递错误(32位专用),SEH(64位专用)),以及QT的实验室项目
2014-08-09 使用VS2005安装和编译QT4.53源码
2013-08-09 Java的OO与多态
2013-08-09 Java的默认构造函数调用
2013-08-09 父类与子类之间静态函数的调用以及函数参数的传递
2012-08-09 Delphi高手突破第二章(4),VMT与DMT