从 python 3.5.2 移动到 python 3.7.4 时出现 winpcapy 错误

winpcapy errors when moving from python 3.5.2 to python 3.7.4

我一直很高兴地使用一些 python 来生成原始以太网帧,并使用 Python 3.5.2 和 winpcapy 将它们发送到 Windows 7 上选择的接口。我刚刚安装了 Python 3.7.4,现在在尝试 运行 相同代码时收到错误消息。

import ctypes
import winpcapy
import sys

errbuf = ctypes.create_string_buffer(winpcapy.PCAP_ERRBUF_SIZE)

alldevs = ctypes.POINTER(winpcapy.pcap_if_t)()
winpcapy.pcap_findalldevs(ctypes.byref(alldevs), errbuf)
device = alldevs.contents
interfaces = []
while True:
    interfaces.append(device)
    if not device.next:
        break
    device = device.next.contents
print(interfaces)

3.5 中 运行 时的代码片段打印找到的接口列表。但是,如果我在 3.7 中 运行 它,我会得到:

Traceback (most recent call last): File "Z:\proj\eth\socket.py", line 5, in 
<module> errbuf = ctypes.create_string_buffer(winpcapy.PCAP_ERRBUF_SIZE) 
AttributeError: module 'winpcapy' has no attribute 'PCAP_ERRBUF_SIZE' 

现在,我可以将 'PCAP_ERRBUF_SIZE' 替换为一个整数值,但随后我遇到了更多问题,看起来我在 3.7 中使用 winpcapy 的方式通常存在一些问题。还有其他人遇到过这类问题吗?

你是如何获得winpcapy的?

Google 代码上的 PyPI winpcapy package is not the same as the historical winpcapy script。 PyPI 包在 winpcapy.winpcapy_types 模块中公开 libpcap API。

在原始 winpcapy 脚本中 PCAP_ERRBUF_SIZE 是在 winpcapy 模块中定义的值。您可以像在您提供的代码中一样导入它:

import winpcapy
print(winpcapy.PCAP_ERRBUF_SIZE)

但是,在较新的 PyPI 包中 PCAP_ERRBUF_SIZE 是在 winpcapy.winpcapy_types 中定义的。所以你需要做类似的事情:

from winpcapy import winpcapy_types as wtypes
print(wtypes.PCAP_ERRBUF_SIZE)