ctypes и передача по ссылке на функцию
Я пытаюсь использовать libpcap в python3, используя ctypes.
учитывая следующую функцию в C
pcap_lookupnet(dev, &net, &mask, errbuf)
в питоне у меня есть следующее
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
как вы справляетесь с & бла ценностями?
3 ответа
Вам нужно создать экземпляры для net
а также mask
и использовать byref
передать их.
mask = ctypes.c_uint32()
net = ctypes.c_int32()
pcap_lookupnet(dev, ctypes.byref(net), ctypes.byref(mask), errbuf)
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
,
Вам, вероятно, нужно использовать ctypes.pointer
, как это:
pcap_lookupnet(dev, ctypes.pointer(net), ctypes.pointer(mask), errbuf)
Обратитесь к разделу учебника ctypes по указателям для получения дополнительной информации.
Я предполагаю, что вы создали прокси ctypes для других аргументов. Если dev
требуется строка, например, вы не можете просто передать строку Python; вам нужно создать ctypes_wchar_p
Или что-то вдоль этих линий.