python - 在python上进行ARP请求

标签 python sockets networking arp

我正在尝试在 python 上发出 ARP 请求。我的代码:

import socket
from struct import pack
from uuid import getnode as get_mac

def main():
    dest_ip = [10, 7, 31, 99]
    local_mac = [int(("%x" % get_mac())[i:i+2], 16) for i in range(0, 12, 2)]
    local_ip = [int(x) for x in socket.gethostbyname(socket.gethostname()).split('.')]

    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.SOCK_RAW)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.bind(('', 0))

    ARP_FRAME = [
        pack('!H', 0x0001), # HRD
        pack('!H', 0x0800), # PRO
        pack('!B', 0x06), # HLN
        pack('!B', 0x04), # PLN 
        pack('!H', 0x0001), # OP
        pack('!6B', *local_mac), # SHA
        pack('!4B', *local_ip), # SPA
        pack('!6B', *(0x00,)*6), # THA
        pack('!4B', *dest_ip), # TPA
    ]
    print(ARP_FRAME)
    sock.sendto(b''.join(ARP_FRAME), ('255.255.255.255', 0))
    sock.close()

if __name__ == "__main__":
    main()

当我执行此代码时,Wireshark 没有捕获任何数据包。 我认为 socket 有问题。当我执行 socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW) 时,我得到 AttributeError: module 'socket' has no attribute 'AF_PACKET'。我做错了什么以及如何解决它?

OS X 10.11.3

最佳答案

socket.AF_INET 是 IP 数据包的套接字。由于 ARP 是以太网,因此它不会以这种方式工作,您需要访问以太网层。

在 Linux 上,您可以使用:

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))

其中 s 是您用来分配套接字的任何变量。

要发送数据包,您应该绑定(bind)接口(interface)

s.bind(("eth0", 0))

其中“eth0”是网络接口(interface)名称。

之后,您可以发送数据包

s.send(packet)

数据包是字节串形式的有效负载。

AttributeError: module 'socket' has no attribute 'AF_PACKET'

表示 AF_PACKET 未在您的平台上实现。 不幸的是,某些平台不提供对低级网络层的访问,对于 Windows 是这样,对于 OS X 可能也是如此。 至少,即使在 Linux 上,您也需要 root 权限才能访问低级网络,否则您将收到拒绝访问错误。

通过 Python 访问低级网络的一个想法是使用虚拟机(例如 Virtualbox),并用它运行 Linux 客户机。

关于python - 在python上进行ARP请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35348012/

相关文章:

python - 如何将其从Python转换为C?

python - CNTK 中以下 tensorflow 片段的等价物是什么

C 非阻塞 UDP 套接字

javascript - R网络D3 : click action to show information from node data frame

java.net.SocketException : Software caused connection abort: socket write error 异常

Java网络编程从客户端读取数据

python - Python 中的 My.Resources(vb.net) 相当于什么?

一段时间后Python Gspread 401错误

c++ - Windows,C++ : two connections on one server socket?

c - 在从套接字读取响应时,我得到了我之前写的内容