本文博客链接: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

最新文章

  1. 彻底理解js中this的指向,不必硬背。
  2. python—基础类的那点儿所以然
  3. php 301
  4. Spring depends-on介绍
  5. Cocos2d-x内存自动释放机制--透彻篇
  6. Maven Build Profiles--reference
  7. Fastjson Feathure
  8. 用两个栈实现队列,剑指offer P59
  9. SQL中的左连接与右连接有什么区别,点解返回值会不同?(转)
  10. “HK”的日常之ARP断网攻击
  11. 例:三位老师对某次数学竞赛进行了预测,他们的预测如下:   甲:学生A得了第一名,学生B得第三名。   乙:学生C得了第一名,学生D得第四名。   丙:学生D得了第二名,学生A得第三名。 结果表明,他们都说对了一半,说错了一半,并且无并列名次,输出A、B、C和D各自的名次。
  12. 三、ASP.NET Core 部署Linux
  13. Dynamic Programming | Set 1 (Overlapping Subproblems Property)
  14. C# ASP.NET MVC 配置允许跨域访问
  15. python 阶乘
  16. CDH安装kafka
  17. bzoj1601 / P1550 [USACO08OCT]打井Watering Hole(堆优化prim)
  18. java indexOf 和 split的用法
  19. delphi使用SQL的教程4(使用Params属性为参数赋值 )
  20. threading模块、ThreadLocal

热门文章

  1. 【30.00%】【vijos 1909】寻找道路
  2. 多线程下使用使用 UniDAC+MSSQL 需要注意的问题(使用CoInitialize)
  3. 由Maximum Gap,对话桶排序,基数排序和统计排序
  4. 正定矩阵(definite matrix)
  5. JScript读取XML文件
  6. Installation and Configuration Guide
  7. DELPHI7中 TObjectList sort排序问题
  8. Lexer的设计--上(3)
  9. DOM解析xml实现读、写、增、删、改
  10. 解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误