天天看点

Qt之QNetworkInterface简述常用接口获取所有IP地址获取网络接口列表更多参考

qnetworkinterface类负责提供主机的ip地址和网络接口的列表。

qnetworkinterface表示了当前程序正在运行时与主机绑定的一个网络接口。每个网络接口可能包含0个或多个ip地址,每个ip地址都可选择性地与一个子网掩码和/或一个广播地址相关联。这样的列表可以通过addressentries()方法获得。当子网掩码或者广播地址不必要时,可以使用alladdresses()便捷函数来仅仅获得ip地址。

qnetworkinterface使用hardwareaddress()方法获取接口的硬件地址。

不是所有的操作系统都支持这些所有的特性。只有ipv4地址可以保证在所有平台上都能被这个类列举出来,尤其是ipv6地址的列举目前只支持windows xp及相关版本、linux、macos和bsds。

<a href="#%e7%ae%80%e8%bf%b0">简述</a>

<a href="#%e5%b8%b8%e7%94%a8%e6%8e%a5%e5%8f%a3">常用接口</a>

<a href="#%e8%8e%b7%e5%8f%96%e6%89%80%e6%9c%89ip%e5%9c%b0%e5%9d%80">获取所有ip地址</a>

<a href="#%e8%8e%b7%e5%8f%96%e7%bd%91%e7%bb%9c%e6%8e%a5%e5%8f%a3%e5%88%97%e8%a1%a8">获取网络接口列表</a>

<a href="#%e6%9b%b4%e5%a4%9a%e5%8f%82%e8%80%83">更多参考</a>

枚举 qnetworkinterface::interfaceflag

标识 qnetworkinterface::interfaceflags

指定网络接口相关的标识,可能的值:

常量

描述

qnetworkinterface::isup

0x1

网络接口处于活动状态

qnetworkinterface::isrunning

0x2

网络接口已分配资源

qnetworkinterface::canbroadcast

0x4

网络接口工作在广播模式

qnetworkinterface::isloopback

0x8

网络接口是环回接口:也就是说,它是一个虚拟接口,其目的是主机本身

qnetworkinterface::ispointtopoint

0x10

网络接口是一个点对点接口:也就是说,有一个,单一的其他地址可以直接由它到达。

qnetworkinterface::canmulticast

0x20

网络接口支持多播

注意:一个网络接口不能既是broadcast-based又是point-to-point。

interfaceflags类型是一个qflags类型定义,它存储一个或interfaceflag的组合值。

<code>qlist&lt;qhostaddress&gt; alladdresses() [static]</code>

这个便利函数返回主机上面发现的所有ip地址。相当于allinterfaces()返回的所有对象调用addressentries()来获取qhostaddress对象列表,然后对每一个对象调用qhostaddress::ip()方法。

<code>qlist&lt;qnetworkinterface&gt; allinterfaces() [static]</code>

返回的主机上找到的所有的网络接口的列表。在失败情况下,它会返回一个空列表。

<code>qlist&lt;qnetworkaddressentry&gt; addressentries() const</code>

返回ip地址列表,这个接口具备连同与其相关的网络掩码和广播地址。

如果不需要子网掩码或广播地址的信息,可以调用alladdresses()函数来只获取ip地址。

interfaceflags flags() const

返回与此网络接口关联的标志。

qstring hardwareaddress() const

返回此接口的底层硬件地址。在以太网接口上,这将是表示mac地址的字符串,用冒号分隔。

其他接口类型可能有硬件地址的其他类型。不应该依赖于实现这个函数返回一个有效的mac地址。

qstring humanreadablename() const

如果名称可确定,在windows上,返回网络接口的人类可读的名称,例如:“本地连接”;如果不能,这个函数返回值与name()相同。用户可以在windows控制面板中修改人类可读的名称,因此它可以在程序的执行过程中变化的名称。

在unix上,此函数目前返回值总是和name()相同,因为unix系统不存储人类可读的名称的配置。

bool isvalid() const

如果此qnetworkinterface对象包含一个的有效的网络接口,则返回true。

qstring qnetworkinterface::name() const

返回网络接口的名称。在unix系统中,这是一个包含接口的类型和任选的序列号的字符串,例如:“eth0”、“lo”或者“pcn0”;在windows中,这是一个内部id,用户不能更改。

通过调用便利的静态函数alladdresses(),可以返回一个qhostaddress地址列表(只能获取ip地址,没有子网掩码和广播地址的信息)。

输出如下:

address : “fe80::550c:ab19:fb48:1c9%15” address : “169.254.1.201” address : “fe80::d086:8566:6065:8954%11” address : “172.18.4.165” address : “fe80::f864:a962:7219:f98e%16” address : “192.168.17.1” address : “fe80::8169:691f:148e:d3cb%17” address : “192.168.178.1” address : “fe80::5996:27a3:83b5:2ae7%18” address : “192.168.56.1” address : “::1” address : “127.0.0.1”

通过调用便利的静态函数allinterfaces(),可以返回一个qnetworkinterface网络接口列表(通过qnetworkaddressentry,可以获取ip地址、子网掩码和广播地址等信息)。

通过flags()函数,可以获取到当前网络接口的标识,利用testflag()进行过滤,就可以获取我们想要的内容(设备名、硬件地址、名字)。

注意:为了简单,我注释掉了ip地址的信息,需要的可以自行测试。

device : “{be9972cd-860e-4e15-8ce2-3f25ef0a7a24}” hardwareaddress : “94:de:80:21:92:17” human readable name : “本地连接” device : “{29f85058-e757-4f60-bf7b-47f6227c8cbc}” hardwareaddress : “00:50:56:c0:00:01” human readable name : “vmware network adapter vmnet1” device : “{a297491c-d43c-4f85-a674-88368f8d4fc1}” hardwareaddress : “00:50:56:c0:00:08” human readable name : “vmware network adapter vmnet8” device : “{1ae5f6fc-478a-4eab-b4d2-86201a6b2090}” hardwareaddress : “0a:00:27:00:00:12” human readable name : “virtualbox host-only network”

<a href="http://blog.csdn.net/liang19890820/article/details/52249509">qt之网络编程</a>

<a href="http://blog.csdn.net/liang19890820/article/details/50774795">qt之qhostinfo</a>

<a href="http://blog.csdn.net/liang19890820/article/details/52273986">qt之qhostaddress</a>

<a href="http://blog.csdn.net/liang19890820/article/details/52276646">qt之qnetworkaddressentry</a>

继续阅读