Python 获取局域网下所有 IP 地址

作为一名刚入行的开发者,你可能会遇到需要获取局域网下所有 IP 地址的情况。在这篇文章中,我将向你展示如何使用 Python 来实现这一功能。

1. 准备工作

在开始之前,我们需要确保你的开发环境已经安装了 Python。此外,我们还需要安装一个名为 scapy 的第三方库,它可以帮助我们发送和接收网络数据包。你可以通过以下命令安装 scapy

pip install scapy

2. 流程概述

下面是获取局域网下所有 IP 地址的步骤:

步骤 描述
1 导入所需的库
2 设置局域网的 IP 范围
3 发送 ARP 请求
4 接收 ARP 响应
5 提取 IP 地址和 MAC 地址
6 打印结果

3. 编写代码

接下来,我们将按照上述步骤编写代码。

3.1 导入所需的库

from scapy.all import ARP, Ether, srp

这行代码导入了 scapy 库中的 ARPEthersrp 函数。

3.2 设置局域网的 IP 范围

ip_range = ["192.168.1.1", "192.168.1.254"]

这里我们假设局域网的 IP 范围是从 192.168.1.1192.168.1.254。你可以根据实际情况修改这个范围。

3.3 发送 ARP 请求

arp_request = ARP(pdst=ip)
ether_request = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether_request / arp_request

这段代码创建了一个 ARP 请求,其中 pdst 参数指定了目标 IP 地址。Ether 函数用于设置以太网帧的目的地地址,这里我们使用广播地址 ff:ff:ff:ff:ff:ff

3.4 接收 ARP 响应

answered, _ = srp(packet, timeout=1, verbose=0)

srp 函数用于发送和接收数据包。timeout 参数指定了等待响应的时间,verbose 参数用于控制输出信息的详细程度。

3.5 提取 IP 地址和 MAC 地址

for sent, received in answered:
    print(f"IP: {received.psrc} - MAC: {received.hwsrc}")

这行代码遍历收到的 ARP 响应,提取并打印每个设备的 IP 地址和 MAC 地址。

3.6 完整代码

from scapy.all import ARP, Ether, srp

def get_lan_ips():
    ip_range = ["192.168.1.1", "192.168.1.254"]
    arp_request = ARP(pdst=ip_range[1])
    ether_request = Ether(dst="ff:ff:ff:ff:ff:ff")
    packet = ether_request / arp_request

    answered, _ = srp(packet, timeout=1, verbose=0)

    for sent, received in answered:
        print(f"IP: {received.psrc} - MAC: {received.hwsrc}")

get_lan_ips()

4. 类图

下面是使用 Mermaid 语法绘制的类图:

classDiagram
    class ARPRequest {
        +pdst: str
    }
    class EtherRequest {
        +dst: str
    }
    class Packet {
        +ether_request: EtherRequest
        +arp_request: ARPRequest
    }
    ARPRequest --|> EtherRequest: contains
    EtherRequest --|> Packet: contains

5. 结果展示

假设我们运行上述代码,可能会得到如下结果:

IP: 192.168.1.2 - MAC: 00:1A:2B:3C:4D:5E
IP: 192.168.1.3 - MAC: 6E:7F:8G:9H:0I:1J
...

6. 结语

通过这篇文章,你应该已经学会了如何使用 Python 获取局域网下的所有 IP 地址。这个过程涉及到网络编程的基本概念,如 ARP 请求和响应。希望这篇文章能帮助你更好地理解网络编程,并为你的项目提供一些启示。

如果你有任何问题或需要进一步的帮助,请随时联系我。祝你编程愉快!