ctypes и передача по ссылке на функцию - PullRequest
7 голосов
/ 23 сентября 2011

Я пытаюсь использовать libpcap в python3, используя 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

как вы справляетесь с & бла ценностями?

Ответы [ 3 ]

16 голосов
/ 23 сентября 2011

Вам необходимо создать экземпляры для net и mask и использовать byref для их передачи.

mask = ctypes.c_uint32()
net = ctypes.c_int32()
pcap_lookupnet(dev, ctypes.byref(net), ctypes.byref(mask), errbuf)
2 голосов
/ 23 сентября 2011

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.

2 голосов
/ 23 сентября 2011

Вам, вероятно, нужно использовать ctypes.pointer, например:

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

См. Учебное руководство по ctypes для указателей для получения дополнительной информации.

I'mпри условии, что вы создали прокси-серверы ctypes и для других аргументов.Например, если dev требует строку, вы не можете просто передать строку Python;вам нужно создать ctypes_wchar_p или что-то в этом роде.

...