本文博客鏈接:http://blog.csdn.net/jdh99,作者:jdh,轉載請注明.
環境:Ubuntu10.04 + Qt4.7.0
Linux獲得本地IP的方法,我嘗試了兩種
1.用QHostInfo類解析
QHostInfo類可以解析域名,理論上也可以解析本地IP,可是經過嘗試,我發現解析出來的IP是127.0.0.1是本地回環地址,不符合我的需求。
代碼:
- //獲取本地IP
- QHostInfo info=QHostInfo::fromName(QHostInfo::localHostName());
- //QHostInfo info=QHostInfo::fromName("www.google.com");
- //Sys_Res.local_ip = info.addresses().first().toString();
- //qDebug() << Sys_Res.local_ip;
- if (info.error() != QHostInfo::NoError)
- {
- qDebug() << "Lookup failed:" << info.errorString();
- return;
- }
- for (int i = 0;i < info.addresses().size();i++)
- {
- qDebug() << "Found address:" << info.addresses()[i].toString() << endl;
- }
2.用QNetworkInterface解析
用這個類可以獲取系統底層的網絡參數,經過實踐是可行的,我參考的文章:http://qt.csdn.net/articles.aspx?pointid=489&pointid2=7
參考代碼截取:
- 2.通過QNetworkInterface類來獲取本機的IP地址和網絡接口信息。
- QNetworkInterface類提供了程序所運行時的主機的IP地址和網絡接口信息的列表。在每一個網絡接口信息中都包含了0個或多個IP地址,而每一個IP地址又包含了和它相關的子網掩碼和廣播地址,它們三者被封裝在一個QNetworkAddressEntry對象中。網絡接口信息中也提供了硬件地址信息。我們將widge.cpp構造函數中以前添加的代碼刪除,然后添加以下代碼。
- QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
- //獲取所有網絡接口的列表
- foreach(QNetworkInterface interface,list)
- { //遍歷每一個網絡接口
- qDebug() << “Device: “<<interface.name();
- //設備名
- qDebug() << “HardwareAddress: “<<interface.hardwareAddress();
- //硬件地址
- QList<QNetworkAddressEntry> entryList = interface.addressEntries();
- //獲取IP地址條目列表,每個條目中包含一個IP地址,一個子網掩碼和一個廣播地址
- foreach(QNetworkAddressEntry entry,entryList)
- {//遍歷每一個IP地址條目
- qDebug()<<”IP Address: “<<entry.ip().toString();
- //IP地址
- qDebug()<<”Netmask: “<<entry.netmask().toString();
- //子網掩碼
- qDebug()<<”Broadcast: “<<entry.broadcast().toString();
- //廣播地址
- }
- }
- 其實,如果我們只想利用QNetworkInterface類來獲取IP地址,那么就沒必要像上面那樣復雜,這個類提供了一個便捷的函數allAddresses()來獲取IP地址,例如:
- QString address = QNetworkInterface::allAddresses().first().toString();
- 3.總結。
- 在這一節中我們學習了如何來查找本機網絡設備的相關信息。其實,以后最常用的還是其中獲取IP地址的方法。我們以后可以利用一個函數來獲取IP地址:
- QString Widget::getIP() //獲取ip地址
- {
- QList<QHostAddress> list = QNetworkInterface::allAddresses();
- foreach (QHostAddress address, list)
- {
- if(address.protocol() == QAbstractSocket::IPv4Protocol)
- //我們使用IPv4地址
- return address.toString();
- }
- return 0;
- }
把這段代碼嵌入到我的程序中:
- QList<QHostAddress> list = QNetworkInterface::allAddresses();
- foreach (QHostAddress address, list)
- {
- if(address.protocol() == QAbstractSocket::IPv4Protocol)
- {
- //IPv4地址
- if (address.toString().contains("127.0."))
- {
- continue;
- }
- Sys_Res.local_ip = address.toString();
- }
- }
- if (Sys_Res.local_ip == "127.0.0.1")
- {
- qDebug() << "get local ip fail";
- return;
- }
- else
- {
- qDebug() << Sys_Res.local_ip;
- }
http://blog.csdn.net/jdh99/article/details/6679692
qt中提供了可以實現域名解析功能的類QHostInfo,這個類解析域名提供兩種機制,一種是阻塞式,一種是非阻塞信號槽機制,下面介紹第二種機制的實現方法。
qt的幫助中給出了這個類的例子:
- QHostInfo::lookupHost("www.kde.org",this, SLOT(lookedUp(QHostInfo)));
- //當解析成功域名后,會調用lookedUp槽函數
- void MyWidget::lookedUp(const QHostInfo &host)
- {
- if (host.error() != QHostInfo::NoError) {
- qDebug() << "Lookup failed:" << host.errorString();
- return;
- }
- foreach (QHostAddress address, host.addresses())
- qDebug() << "Found address:" << address.toString();
- }
仿照這個例子,我做了google域名的解析測試:
- QHostInfo::lookupHost("www.google.com",this,SLOT(slot_get_ip(QHostInfo)));
- void test::slot_get_ip(QHostInfo host_info)
- {
- if (host_info.error() != QHostInfo::NoError)
- {
- qDebug() << "Lookup failed:" << host_info.errorString();
- return;
- }
- for (int i = 0;i < host_info.addresses().size();i++)
- {
- qDebug() << "Found address:" << host_info.addresses()[i].toString() << endl;
- }
- }
在調試窗口可以看到解析結果:
- Found address: "64.233.183.106"
- Found address: "64.233.183.147"
- Found address: "64.233.183.99"
- Found address: "64.233.183.103"
- Found address: "64.233.183.104"
- Found address: "64.233.183.105"
http://blog.csdn.net/jdh99/article/details/6675670