Pythonでctypes経由でlibpcapを使用しています。少しラッパーを書いたので、より便利に pcap 関数にアクセスできます。たとえば、 pcap_geterr の場合は次のようになります
# char *pcap_geterr(pcap_t *p);
geterr = _pcap.pcap_geterr
geterr.argtypes = [ctypes.c_void_p]
geterr.restype = ctypes.c_char_p
しかし、今は pcap_stats を使用する必要があり、pcap_stat 構造体を関数に渡すのに問題があります。
コードは次のようになります
class pcap_stat(ctypes.Structure):
'''
struct pcap_stat {
u_int ps_recv; /* number of packets received */
u_int ps_drop; /* number of packets dropped */
u_int ps_ifdrop; /* drops by interface, not yet supported */
#ifdef WIN32
u_int bs_capt; /* number of packets that reach the application */
#endif /* WIN32 */
};
'''
_fields_ = [("ps_recv", ctypes.c_uint), ("ps_drop", ctypes.c_uint), ("ps_ifdrop", ctypes.c_uint)]
# int pcap_stats(pcap_t *p, struct pcap_stat *ps);
stats = _pcap.pcap_stats
stats.argtypes = [ctypes.c_void_p, ctypes.c_void_p] # is the second argument right?
stats.restype = ctypes.c_uint
stats の 2 番目の引数の型が正しいかどうか、Python で C 構造体を関数に渡す方法がわかりません。Cでは、おそらく次のようになります
struct pcap_stat stat;
pcap_stats(handle, &stat);
しかし、Pythonではどうですか?