ctypes and passing a by reference to a function
I'm trying to use libpcap in python3 using ctypes.
given the following function in C
p开发者_运维知识库cap_lookupnet(dev, &net, &mask, errbuf)
in python I have the following
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)
and the error i get is
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
how do you deal with &blah values ?
You need to create instances for net
and mask
, and use byref
to pass them.
mask = ctypes.c_uint32()
net = ctypes.c_int32()
pcap_lookupnet(dev, ctypes.byref(net), ctypes.byref(mask), errbuf)
You probably need to use ctypes.pointer
, like this:
pcap_lookupnet(dev, ctypes.pointer(net), ctypes.pointer(mask), errbuf)
See the ctypes tutorial section on pointers for more information.
I'm assuming you've created ctypes proxies for the other arguments as well. If dev
requires a string, for example, you can't simply pass in a Python string; you need to create a ctypes_wchar_p
or something along those lines.
ctypes.c_uint32
is a type. You need an instance:
mask = ctypes.c_uint32()
net = ctypes.c_int32()
Then pass using ctypes.byref
:
pcap_lookupnet(dev,ctypes.byref(mask),ctypes.byref(net),errbuf)
You can retrieve the value using mask.value
.
精彩评论