当前位置: 首页 > 面试题库 >

如何从接口获取物理接口IP地址

龙承颜
2023-03-14
问题内容

到目前为止,我使用PyQt类所做的事情:

all_Addresses = QNetworkInterface.allAddresses()    #list-of-QHostAddress

for addr in all_Addresses:
    print(addr.toString())

输出:

172.16.0.186 - Virtual Interface IP address
192.168.10.2 - Physical interface IP address. I want this one.
127.0.0.1

使用socket

import socket
print(socket.gethostbyname(socket.gethostname()))

输出:

172.16.0.186 - When openVPN is on
192.168.10.2 - When its off
  1. 有没有办法区分它们?
  2. 可以使用普通的Python代替PyQt类吗?
  3. 如何获得IPv6地址?

问题答案:

您应该使用netifaces。它被设计为跨平台的,并且包含Windows专用代码以及可在不同UNIX
/ UNIX类平台上工作的各种通用版本。

从netifaces版本0.10.0开始,支持Python3。

使用摘要

>>> from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE
>>> import netifaces as ni
>>> ni.interfaces()
['lo', 'eth0', 'eth1', 'vboxnet0', 'dummy1']
>>>
>>> ni.ifaddresses('eth0')[AF_LINK]   # NOTE: AF_LINK is an alias for AF_PACKET
[{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:02:55:7b:b2:f6'}]
>>> ni.ifaddresses('eth0')[AF_INET]
[{'broadcast': '172.16.161.7', 'netmask': '255.255.255.248', 'addr': '172.16.161.6'}]
>>>
>>> # eth0 ipv4 interface address
>>> ni.ifaddresses('eth0')[AF_INET][0]['addr']
'172.16.161.6'
>>>>

细节

Windows支持:

大多数MS Windows安装都不需要编译器。如果收到有关为Windows安装MS Visual C
++的警告,请非常小心,因为您需要将用于python的编译器版本与用于模块的编译器版本匹配。

netifaces数据结构的详细示例:

>>> import netifaces as ni
>>> ni.interfaces()
['lo', 'eth0', 'eth1', 'vboxnet0', 'dummy1']
>>> ni.ifaddresses('eth0')
{
    17: [
        {
            'broadcast': 'ff:ff:ff:ff:ff:ff',
            'addr': '00:02:55:7b:b2:f6'
        }
    ],
    2: [
        {
            'broadcast': '172.16.161.7',
            'netmask': '255.255.255.248',
            'addr': '172.16.161.6'
        }
    ],
    10: [
        {
            'netmask': 'ffff:ffff:ffff:ffff::',
            'addr': 'fe80::202:55ff:fe7b:b2f6%eth0'
        }
    ]
}
>>> 
>>> print(ni.ifaddresses.__doc__)
Obtain information about the specified network interface.

Returns a dict whose keys are equal to the address family constants,
e.g. netifaces.AF_INET, and whose values are a list of addresses in
that family that are attached to the network interface.
>>>
>>> # for the IPv4 address of eth0
>>> ni.ifaddresses('eth0')[2][0]['addr']
'172.16.161.6'

用于索引协议的数字来自/usr/include/linux/socket.h(在Linux中)… 编辑
:我的3.2内核在这里具有它们:/usr/src/linux-headers-3.2.0-4-common/include/linux/socket.h

#define AF_INET         2       /* Internet IP Protocol         */
#define AF_INET6        10      /* IP version 6                 */
#define AF_PACKET       17      /* Packet family                */

好消息是您不必记住所有这些标头常量,它们包含在netifaces中:

>>> from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE
>>> import netifaces as ni


 类似资料:
  • 问题内容: 如何从C代码获取Linux上接口的IPv4地址? 例如,我想获取分配给eth0的IP地址(如果有)。 问题答案: 尝试这个: 代码示例是从这里获取的。

  • 当Unix上的Python脚本出现错误时,会发送一封电子邮件。 如果IP地址192.168.100.37是测试服务器,我被要求将{测试环境}添加到电子邮件的主题行。这样我们就可以有一个版本的脚本和一种方法来判断电子邮件是否来自测试服务器上混乱的数据。 然而,当我在谷歌上搜索时,我一直在寻找以下代码: 然而,这给了我127.0.1.1的IP地址。当我使用时,我得到了这个 首先,我不知道它是从哪里12

  • 问题内容: 有没有办法使用libpcap在Linux中获取接口的IP地址? 我发现了这个, 获取Linux上一个接口的IP地址,但这不使用pcap。 此外,在PCAP例子是说,像这应该得到你的IP,但它给你的网络地址。 问题答案: 使用功能: 输出:

  • 问题内容: 为了确定给定类型是否使用reflect包实现接口,您需要将reflect.Type传递给reflect.Type.Implements()。您如何获得这些类型之一? 作为一个例子,试图获得未初始化的os.Error(接口)类型的类型并 没有 工作(它恐慌的时候,你要调用它的种类()) 问题答案: 像这样做: 或一行:

  • 问题内容: 看来android的java.net.NetworkInterface实现没有 byte [] getHardwareAddress()方法 http://developer.android.com/reference/java/net/NetworkInterface.html 我发现有几个论坛的人都试图这样做,但没有明确的答案,我需要获得一个跨设备的UUID,所以我不能依赖电话号码

  • 问题内容: 如何在接口内部获取值的地址? 我有一个结构存储在接口的list.List元素中: 但是我得到这个: 这是怎么回事?由于该结构存储在接口中,为什么我不能获得指向它的指针? 问题答案: 要了解为什么不可能这样做,考虑一下接口变量实际上是什么很有帮助。接口值占两个字,第一个描述所包含值的类型,第二个(a)保存所包含的值(如果它适合字内)或(b)指向该值的存储指针(如果该值不适合一个单词)。