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

环境:Ubuntu10.04 + Qt4.7.0

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

1.用QHostInfo类解析

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

代码:

  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. if (info.error() != QHostInfo::NoError)
  7. {
  8. qDebug() << "Lookup failed:" << info.errorString();
  9. return;
  10. }
  11. for (int i = 0;i < info.addresses().size();i++)
  12. {
  13. qDebug() << "Found address:" << info.addresses()[i].toString() << endl;
  14. }

2.用QNetworkInterface解析

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

参考代码截取:

  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. }
  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. }

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

    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的帮助中给出了这个类的例子:

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

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

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

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

    1. Found address: "64.233.183.106"
    2. Found address: "64.233.183.147"
    3. Found address: "64.233.183.99"
    4. Found address: "64.233.183.103"
    5. Found address: "64.233.183.104"
    6. Found address: "64.233.183.105"

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

qt获得本地IP的方法,qt中域名解析的方法的更多相关文章

  1. python获取本地ip地址的方法

    #_*_coding:utf8_*_ #以下两种方法可以在ubuntu下或者windows下获得本地的IP地址 import socket # 方法一 localIP = socket.gethost ...

  2. JNI学习笔记_Java调用C —— Android中使用的方法

    一.笔记 1.JNI(Java Native Interface),就是如何使用java去访问C/C++编写的那些库.若想深入了解JNI可以看官方文档jni.pdf.优秀博文:Android JNI知 ...

  3. 如何重写Java中的equals方法

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  4. C#编程(六十一)------------LINQ中的扩展方法

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...

  5. 常用的兼容IE和火狐FF等浏览器的js方法(js中ie和火狐的一些差别)

    介绍了网页上常用的IE/火狐兼容性该页的做法,并给出了代码,相当实用了.为了方便大家阅读代码,以下以 IE 代替 Internet Explorer,以 MF/FF 代替 Mozzila Firefo ...

  6. 49. ArrayList LinkedList中特有的方法

    集合的体系:--------------| Collection  单列集合的根接口 ----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复 ------|A ...

  7. Day07_39_集合中的remove()方法 与 迭代器中的remove()方法

    集合中的remove()方法 与 迭代器中的remove()方法 深入remove()方法 iterator 中的remove()方法 collection 中的remove(Object)方法 注意 ...

  8. 解析Qt中QThread使用方法

    本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...

  9. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

随机推荐

  1. Android Studio运行main方法

    这样想做一些测试就很简单了 实现步骤如下: 1.当前项目右键->new->Module->Java Library 2.修改你创建javaLib的build.gradle文件 改为( ...

  2. java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结

    代码如下: import java.io.FileWriter; import java.io.IOException; import java.io.RandomAccessFile; public ...

  3. IIS与TOMCAT协同工作---在IIS下运行JSP页面

    转载:http://www.cnblogs.com/sjpisaboy/archive/2006/12/07/585749.html 最近碰到一个问题:我们实验室的一台IBM EServer服务器被运 ...

  4. C#步骤控件

    C#开发step步骤条控件   现在很多的javascript控件,非常的不错,其中step就是一个,如下图所示: 那么如何用C#来实现一个step控件呢? 先定义一个StepEntity类来存储步骤 ...

  5. 解决Eclipse代码提示消失的方法

    注意:首先要做的是windows->preferences->java->Editor->"ContentAssist", auto-activetion中 ...

  6. 在MVC项目中分页使用MvcPager插件

    参考网站  http://www.webdiyer.com/mvcpager/demos/ 这个插件非常简单易用,如果想快速使用 可以参考我这篇文章,其实参考网站也是非常简单的 首先选择你的web项目 ...

  7. OpenMP中的同步和互斥

    在多线程编程中必须考虑到不同的线程对同一个变量进行读写访问引起的数据竞争问题.如果线程间没有互斥机制,则不同线程对同一变量的访问顺序是不确定的,有可能导致错误的执行结果. OpenMP中有两种不同类型 ...

  8. OpenCV实现马赛克和毛玻璃滤镜效果

    一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠 ...

  9. WPF安装打印机驱动后PrintDialog 执行打印事件

    原文:WPF安装打印机驱动后PrintDialog 执行打印事件 WPF可以很好的利用流文档来实现打印预览和PrintDialog 实现打印功能,但是我在这只是写了一个很简单的打印功能演示. Page ...

  10. sklearn、theano、TensorFlow 以及 theras 的理解

    sklearn ⇒ 机器学习算法和模型: theras theano TensorFlow 1. 理解模型以及函数,参数返回值的实际意义 一定要注意模型的构造函数,接收的参数列表,以及该模型本身所要解 ...