最近在學習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