2011-09-23 17 views
7

Próbuję użyć libpcap w python3 używając ctypes.ctypes i przekazanie a przez odniesienie do funkcji

podana następująca funkcja w C

pcap_lookupnet(dev, &net, &mask, errbuf) 

w python Mam następujący

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) 

i Błąd pojawia się

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 

jak radzić sobie z & bla wartości?

Odpowiedz

13

Należy utworzyć wystąpienia dla net i mask i użyć byref, aby je przekazać.

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

Stackoverflow mówi, aby unikać używania komentarzy typu "dziękuję", ale spędziłem dużo czasu próbując znaleźć rozwiązanie tego problemu. Więc dziękuję! :) – LuckyLuc

1

Prawdopodobnie trzeba użyć ctypes.pointer, tak:

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

Zobacz samouczek ctypes rozdział poświęcony pointers aby uzyskać więcej informacji.

Zakładam, że utworzyłeś również proxy ctypes dla innych argumentów. Jeśli na przykład dev wymaga ciągu znaków, nie można po prostu przekazać ciągu w języku Python; musisz utworzyć kod ctypes_wchar_p lub coś podobnego.

+0

netto i maski są bardzo specyficzne rodzaje patrz poniżej int pcap_lookupnet (const char * urządzenie, bpf_u_int32 * podatników nieposiadających siedziby, bpf_u_int32 * maskp, char * errbuf); – user961346

+0

bpf_u_int32 jest naprawdę ... typedef u_int bpf_u_int32; – user961346

1

ctypes.c_uint32 to typ. Musisz instancję:

mask = ctypes.c_uint32() 
net = ctypes.c_int32() 

następnie przekazać za pomocą ctypes.byref:

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

można pobrać wartość używając mask.value.

Powiązane problemy