• qt获得本地IP的方法,qt中域名解析的方法


    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

    环境:Ubuntu10.04 + Qt4.7.0

    Linux获得本地IP的方法,我尝试了两种

    1.用QHostInfo类解析

    QHostInfo类可以解析域名,理论上也可以解析本地IP,可是经过尝试,我发现解析出来的IP是127.0.0.1是本地回环地址,不符合我的需求。

    代码:

    [cpp] view plain copy
     
    1. //获取本地IP  
    2.     QHostInfo info=QHostInfo::fromName(QHostInfo::localHostName());  
    3.     //QHostInfo info=QHostInfo::fromName("www.google.com");  
    4.     //Sys_Res.local_ip = info.addresses().first().toString();  
    5.     //qDebug() << Sys_Res.local_ip;  
    6.   
    7.     if (info.error() != QHostInfo::NoError)  
    8.     {  
    9.          qDebug() << "Lookup failed:" << info.errorString();  
    10.          return;  
    11.     }  
    12.   
    13.     for (int i = 0;i < info.addresses().size();i++)  
    14.     {  
    15.          qDebug() << "Found address:" << info.addresses()[i].toString() << endl;  
    16.     }  


    2.用QNetworkInterface解析

    用这个类可以获取系统底层的网络参数,经过实践是可行的,我参考的文章:http://qt.csdn.net/articles.aspx?pointid=489&pointid2=7

    参考代码截取:

    [cpp] view plain copy
     
    1. 2.通过QNetworkInterface类来获取本机的IP地址和网络接口信息。  
    2. QNetworkInterface类提供了程序所运行时的主机的IP地址和网络接口信息的列表。在每一个网络接口信息中都包含了0个或多个IP地址,而每一个IP地址又包含了和它相关的子网掩码和广播地址,它们三者被封装在一个QNetworkAddressEntry对象中。网络接口信息中也提供了硬件地址信息。我们将widge.cpp构造函数中以前添加的代码删除,然后添加以下代码。  
    3. QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();  
    4.     //获取所有网络接口的列表  
    5.     foreach(QNetworkInterface interface,list)  
    6.     {  //遍历每一个网络接口  
    7.         qDebug() << “Device: “<<interface.name();  
    8.         //设备名  
    9.         qDebug() << “HardwareAddress: “<<interface.hardwareAddress();  
    10.         //硬件地址  
    11.         QList<QNetworkAddressEntry> entryList = interface.addressEntries();  
    12.      //获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址  
    13.         foreach(QNetworkAddressEntry entry,entryList)  
    14.         {//遍历每一个IP地址条目  
    15.             qDebug()<<”IP Address: “<<entry.ip().toString();  
    16.             //IP地址  
    17.             qDebug()<<”Netmask: “<<entry.netmask().toString();  
    18.             //子网掩码  
    19.             qDebug()<<”Broadcast: “<<entry.broadcast().toString();  
    20.             //广播地址  
    21.         }  
    22. }  
    [cpp] view plain copy
     
    1. 其实,如果我们只想利用QNetworkInterface类来获取IP地址,那么就没必要像上面那样复杂,这个类提供了一个便捷的函数allAddresses()来获取IP地址,例如:  
    2. QString address = QNetworkInterface::allAddresses().first().toString();  
    3. 3.总结。  
    4. 在这一节中我们学习了如何来查找本机网络设备的相关信息。其实,以后最常用的还是其中获取IP地址的方法。我们以后可以利用一个函数来获取IP地址:  
    5. QString Widget::getIP()  //获取ip地址  
    6. {  
    7.     QList<QHostAddress> list = QNetworkInterface::allAddresses();  
    8.     foreach (QHostAddress address, list)  
    9.     {  
    10.        if(address.protocol() == QAbstractSocket::IPv4Protocol)  
    11. //我们使用IPv4地址  
    12.             return address.toString();  
    13.     }  
    14.        return 0;  
    15. }  


    把这段代码嵌入到我的程序中:

    [cpp] view plain copy
     
      1. QList<QHostAddress> list = QNetworkInterface::allAddresses();  
      2.     foreach (QHostAddress address, list)  
      3.     {  
      4.         if(address.protocol() == QAbstractSocket::IPv4Protocol)  
      5.         {  
      6.             //IPv4地址  
      7.             if (address.toString().contains("127.0."))  
      8.             {  
      9.                 continue;  
      10.             }  
      11.             Sys_Res.local_ip = address.toString();  
      12.         }  
      13.     }  
      14.     if (Sys_Res.local_ip == "127.0.0.1")  
      15.     {  
      16.         qDebug() << "get local ip fail";  
      17.         return;  
      18.     }  
      19.     else  
      20.     {  
      21.         qDebug() << Sys_Res.local_ip;  
      22.     }  

    http://blog.csdn.net/jdh99/article/details/6679692

    qt中提供了可以实现域名解析功能的类QHostInfo,这个类解析域名提供两种机制,一种是阻塞式,一种是非阻塞信号槽机制,下面介绍第二种机制的实现方法。

    qt的帮助中给出了这个类的例子:

    [cpp] view plain copy
     
    1. QHostInfo::lookupHost("www.kde.org",this, SLOT(lookedUp(QHostInfo)));  
    2.   
    3. //当解析成功域名后,会调用lookedUp槽函数  
    4. void MyWidget::lookedUp(const QHostInfo &host)  
    5.  {  
    6.      if (host.error() != QHostInfo::NoError) {  
    7.          qDebug() << "Lookup failed:" << host.errorString();  
    8.          return;  
    9.      }  
    10.   
    11.      foreach (QHostAddress address, host.addresses())  
    12.          qDebug() << "Found address:" << address.toString();  
    13.  }  

    仿照这个例子,我做了google域名的解析测试

    [cpp] view plain copy
     
    1. QHostInfo::lookupHost("www.google.com",this,SLOT(slot_get_ip(QHostInfo)));  
    2.   
    3. void test::slot_get_ip(QHostInfo host_info)  
    4. {  
    5.     if (host_info.error() != QHostInfo::NoError)  
    6.     {  
    7.          qDebug() << "Lookup failed:" << host_info.errorString();  
    8.          return;  
    9.     }  
    10.   
    11.     for (int i = 0;i < host_info.addresses().size();i++)  
    12.     {  
    13.          qDebug() << "Found address:" << host_info.addresses()[i].toString() << endl;  
    14.     }  
    15. }  

    在调试窗口可以看到解析结果:

    [cpp] view plain copy
     
      1. Found address: "64.233.183.106"   
      2.   
      3. Found address: "64.233.183.147"   
      4.   
      5. Found address: "64.233.183.99"   
      6.   
      7. Found address: "64.233.183.103"   
      8.   
      9. Found address: "64.233.183.104"   
      10.   
      11. Found address: "64.233.183.105"   

    http://blog.csdn.net/jdh99/article/details/6675670

  • 相关阅读:
    POJ1125-Stockbroker Grapevine【Floyd】(模板题)
    Codeforces 862B (二分图染色)
    hdu3047 Zjnu Stadium【带权并查集】
    HDU1532 网络流最大流【EK算法】(模板题)
    hdu 2063 过山车【匈牙利算法】(经典)
    HDU-2066-一个人的旅行 【Dijkstra】
    HDU 3625 Examining the Rooms【第一类斯特灵数】
    HDU4372-Count the Buildings【第一类Stirling数】+【组合数】
    HDU 6114 Chess【逆元+组合数】(组合数模板题)
    HDU1211 密文解锁 【扩展欧几里得】【逆元】
  • 原文地址:https://www.cnblogs.com/findumars/p/6152867.html
Copyright © 2020-2023  润新知