0

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ではどうですか?

4

1 に答える 1

1

ポインター引数の正しい型を宣言する必要があります。著しくstruct pcap_stat *psなりctypes.POINTER(pcap_stat)ます。

次に: s = pcap_stat(); pcap_stats(handle, ctypes.byref(s)).

ctypes よりも使いやすい別のインターフェイスについては、http://cffi.readthedocs.orgも参照してください。

于 2013-01-21T17:19:18.670 に答える