2011-09-23 53 views
7

私はctypesを使ってpython3でlibpcapを使用しようとしています。 Cctypesと関数への参照渡し

私は、次の

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 

であるPythonで

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

に次の関数与え

値?あなたは、おそらくこのように、ctypes.pointerを使用する必要が

答えて

13

netmaskのインスタンスを作成し、それにはbyrefを渡す必要があります。

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

Stackoverflowは「感謝」のようなコメントの使用を避けるように言いますが、私はこの問題の解決策を見つけようと多くの時間を費やしました。だから...ありがとう! :) – LuckyLuc

1

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

は、より多くの情報のためpointers上のctypesチュートリアルを参照してください。

他の引数にもctypesプロキシを作成したとします。たとえば、devに文字列が必要な場合は、単純にPython文字列を渡すことはできません。それらの行に沿ってctypes_wchar_pか何かを作成する必要があります。

+0

ネットとマスクが本当に特定の型がint pcap_lookupnet(のconst char型*デバイス、はbpf_u_int32 * netp、 はbpf_u_int32 * maskpの、するchar * errbufに)以下を参照しています。 – user961346

+0

bpf_u_int32は本当にちょうど... typedef u_int bpf_u_int32; – user961346

1

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を使用して値を取得することができます。

関連する問題