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 Или что-то вдоль этих линий.

Другие вопросы по тегам