我正在尝试使用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值?
答案 0 :(得分:16)
您需要为net
和mask
创建实例,并使用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
检索该值。