2011-09-23 5 views
7

Estoy tratando de usar libpcap en python3 usando ctypes.ctypes y pasando una referencia a una función

dada la siguiente función en C

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

en Python Tengo el siguiente

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) 

y el error que consigo es

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 

, ¿cómo lidiar con & bla valores ?

Respuesta

13

Necesita crear instancias para net y mask, y use byref para pasarlas.

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

Stackoverflow dice que evite el uso de comentarios como "gracias", pero pasé mucho tiempo tratando de encontrar una solución a este problema también. ¡Así que gracias! :) – LuckyLuc

1

es probable que necesite usar ctypes.pointer, así:

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

Ver las ctypes sección tutorial sobre pointers para más información.

Supongo que ha creado proxies de ctypes para los otros argumentos también. Si dev requiere una cadena, por ejemplo, no puede simplemente pasar una cadena de Python; necesita crear un ctypes_wchar_p o algo similar.

+0

red y la máscara son tipos muy específicos véase más adelante int pcap_lookupnet (const char * dispositivo, bpf_u_int32 * NETP, bpf_u_int32 * maskp, char * errbuf); – user961346

+0

bpf_u_int32 es realmente solo ... typedef u_int bpf_u_int32; – user961346

1

ctypes.c_uint32 es un tipo. Se necesita una instancia:

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

pasan luego usando ctypes.byref:

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

puede recuperar el valor utilizando mask.value.

Cuestiones relacionadas