ctypes及将引用传递给函数
我正在尝试在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
你需要为 net
和 mask
创建实例,并使用 byref
来传递它们。
mask = ctypes.c_uint32()
net = ctypes.c_int32()
pcap_lookupnet(dev, ctypes.byref(net), ctypes.byref(mask), errbuf)