本文博客链接: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. scala map的常用操作

    package cn.scala_base /** * map常用操作 */ object Map { def main(args: Array[String]): Unit = { //1.不可变m ...

  2. 使用Java Service Wrapper将java程序作为linux服务并且开机自动启动

    以java应用程序为例,打包为tianlong.jar,程序入口为tianlong.QueueTest. 下面在linux的/opt下建立tianlong目录,复制tianlong.jar到/opt/ ...

  3. cordova通过指纹插件进行指纹验证

    原文:cordova通过指纹插件进行指纹验证 版权声明:本文为博主原创文章,转载须注明出处,博客地址:https://blog.csdn.net/wx13227855087 https://blog. ...

  4. 关于MOVE 和 CopyMemory 的用法区别

    最近做了一个数据采集服务器, 根据程序的框架,使用了大量的指针结构体(内存块) 操作. 例子: PArrayByte = ^TArrayByte;  TArrayByte = packed recor ...

  5. create-react-app 支持 装饰器 decorator

    网上常见方法全是安装 babel-plugin-transform-decorators-legacy 然后添加babel配置的, 实际情况是最新版本的create-react-app 生成的项目已经 ...

  6. 2013级别C++文章9周(春天的)工程——运算符重载(两)

    课程主页中:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [程序阅读]阅读程序"简单C++学生 ...

  7. mongoDB 入门手册

    MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...

  8. PHP关联数组教程

    PHP 数组 关联数组 什么是数组?在使用 PHP 进行开发的过程中,或早或晚,您会需要创建许多相似的变量.无需很多相似的变量,你可以把数据作为元素存储在数组中.数组中的元素都有自己的 ID,因此可以 ...

  9. 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)

    原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...

  10. 第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人

    8月9日,晴. "江城如画里,山晓望晴空. 雨水夹明镜.双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机载入子弹和音效及背景音乐,本篇主要加入敌机. 本篇要用到的几个函数解 ...