ctypes并通过引用传递给函数

时间:2011-09-23 14:20:28

标签: python ctypes libpcap

我正在尝试使用ctypes在python3中使用libpcap。

在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

你如何处理&amp; blah值?

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:2)

您可能需要使用ctypes.pointer,如下所示:

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

有关详细信息,请参阅pointers上的ctypes教程部分。

我假设您已经为其他参数创建了ctypes代理。例如,如果dev需要字符串,则不能简单地传入Python字符串;你需要在这些行上创建ctypes_wchar_p或其他东西。

答案 2 :(得分:2)

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检索该值。