ctypes及将引用传递给函数

8 投票
3 回答
23337 浏览
提问于 2025-04-17 02:56

我正在尝试在Python3中使用libpcap,使用ctypes这个库。

这里有一个C语言中的函数:

pcap_lookupnet(dev, &net, &mask, errbuf)

在Python中,我有以下内容:

pcap_lookupnet = pcap.pcap_lookupnet

mask = ctypes.c_uint32
net = ctypes.c_int32

if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)

但是我遇到的错误是:

  File "./libpcap.py", line 63, in <module>
 if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2

那我该如何处理&blah这样的值呢?

3 个回答

2

你可能需要使用 ctypes.pointer,像这样:

pcap_lookupnet(dev, ctypes.pointer(net), ctypes.pointer(mask), errbuf)

想了解更多信息,可以查看 指针 的 ctypes 教程部分。

我假设你已经为其他参数创建了 ctypes 代理。如果 dev 需要一个字符串,比如说,你不能直接传入一个 Python 字符串;你需要创建一个 ctypes_wchar_p 或类似的东西。

3

ctypes.c_uint32 是一种 类型。你需要创建一个实例:

mask = ctypes.c_uint32()
net = ctypes.c_int32()

然后使用 ctypes.byref 来传递它:

pcap_lookupnet(dev,ctypes.byref(mask),ctypes.byref(net),errbuf)

你可以通过 mask.value 来获取这个值。

27

你需要为 netmask 创建实例,并使用 byref 来传递它们。

mask = ctypes.c_uint32()
net = ctypes.c_int32()
pcap_lookupnet(dev, ctypes.byref(net), ctypes.byref(mask), errbuf)

撰写回答