<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

    (C)libpcap函數庫說明

    libpcap獲取數據包函數庫說明

    libpcap的英文意思是 Packet Capture library,即數據包捕獲函數庫。該庫提供的C函數接口可用于

    需要捕獲經過網絡接口(只要經過該接口,目標地址不一定為本機)數據包的系統開發上。由

    Berkeley大學Lawrence Berkeley National? Laboratory研究院的Van Jacobson、Craig Leres和

    Steven McCanne編寫,目前的最新版本為0.4。該函數庫支持Linux、Solaris和*BSD系統平臺。

    主要接口函數說明如下:
    ?
    pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
    獲得用于捕獲網絡數據包的數據包捕獲描述字。device參數為指定打開的網絡設備名。snaplen參數定

    義捕獲數據的最大字節數。promisc指定是否將網絡接口置于混雜模式。to_ms參數指定超時時間(毫

    秒)。ebuf參數則僅在pcap_open_live()函數出錯返回NULL時用于傳遞錯誤消息。

    pcap_t *pcap_open_offline(char *fname, char *ebuf)
    打開以前保存捕獲數據包的文件,用于讀取。fname參數指定打開的文件名。該文件中的數據格式與

    tcpdump和tcpslice兼容。"-"為標準輸入。ebuf參數則僅在pcap_open_offline()函數出錯返回NULL時

    用于傳遞錯誤消息。

    pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)
    打開用于保存捕獲數據包的文件,用于寫入。fname參數為"-"時表示標準輸出。出錯時返回NULL。p參

    數為調用pcap_open_offline()或pcap_open_live()函數后返回的pcap結構指針。fname參數指定打開

    的文件名。如果返回NULL,則可調用pcap_geterr()函數獲取錯誤消息。

    char *pcap_lookupdev(char *errbuf)
    用于返回可被pcap_open_live()或pcap_lookupnet()函數調用的網絡設備名指針。如果函數出錯,則

    返回NULL,同時errbuf中存放相關的錯誤消息。

    int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf)
    獲得指定網絡設備的網絡號和掩碼。netp參數和maskp參數都是bpf_u_int32指針。如果函數出錯,則

    返回-1,同時errbuf中存放相關的錯誤消息。

    int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user)
    ?捕獲并處理數據包。cnt參數指定函數返回前所處理數據包的最大值。cnt=-1表示在一個緩沖區中處

    理所有的數據包。cnt=0表示處理所有數據包,直到產生以下錯誤之一:讀取到EOF;超時讀取。

    callback 參數指定一個帶有三個參數的回調函數,這三個參數為:一個從pcap_dispatch()函數傳遞

    過來的u_char指針,一個pcap_pkthdr結構libpcap函數庫說明。bsp;? 的指針,和一個數據包大小的

    u_char指針。如果成功則返回讀取到的字節數。讀取到EOF時則返回零值。出錯時則返回-1,此時可調

    用pcap_perror()或pcap_geterr()函數獲取錯誤消息。

    int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
    功能基本與pcap_dispatch()函數相同,只不過此函數在cnt個數據包被處理或出現錯誤時才返回,但

    讀取超時不會返回。而如果為pcap_open_live()函數指定了一個非零值的超時設置,然后調用

    pcap_dispatch()函數,則當超時發生時pcap_dispatch()函數會返回。cnt參數為負值時pcap_loop()

    函數將始終循環運行,除非出現錯誤。

    void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp)
    向調用pcap_dump_open()函數打開的文件輸出一個數據包。該函數可作為pcap_dispatch()函數的回調

    函數。

    int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32

    netmask)
    將str參數指定的字符串編譯到過濾程序中。fp是一個bpf_program結構的指針,在pcap_compile()函

    數中被賦值。optimize參數控制結果代碼的優化。netmask參數指定本地網絡的網絡掩碼。
    ????????
    int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
    指定一個過濾程序。fp參數是bpf_program結構指針,通常取自pcap_compile()函數調用。出錯時返回

    -1;成功時返回0。

    u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
    返回指向下一個數據包的u_char指針。

    int pcap_datalink(pcap_t *p)
    返回數據鏈路層類型,例如DLT_EN10MB。

    int pcap_snapshot(pcap_t *p)
    返回pcap_open_live被調用后的snapshot參數值。

    int pcap_is_swapped(pcap_t *p)
    返回當前系統主機字節與被打開文件的字節順序是否不同。

    int pcap_major_version(pcap_t *p)
    返回寫入被打開文件所使用的pcap函數的主版本號。

    int pcap_minor_version(pcap_t *p)
    返回寫入被打開文件所使用的pcap函數的輔版本號。

    int pcap_stats(pcap_t *p, struct pcap_stat *ps)
    向pcap_stat結構賦值。成功時返回0。這些數值包括了從開始捕獲數據以來至今共捕獲到的數據包統

    計。如果出錯或不支持數據包統計,則返回-1,且可調用pcap_perror()或? pcap_geterr()函數來獲

    取錯誤消息。

    FILE *pcap_file(pcap_t *p)
    返回被打開文件的文件名。

    int pcap_fileno(pcap_t *p)
    返回被打開文件的文件描述字號碼。

    void pcap_perror(pcap_t *p, char *prefix)
    在標準輸出設備上顯示最后一個pcap庫錯誤消息。以prefix參數指定的字符串為消息頭。

    char *pcap_geterr(pcap_t *p)
    返回最后一個pcap庫錯誤消息。

    char *pcap_strerror(int error)
    如果strerror()函數不可用,則可調用pcap_strerror函數替代。

    void pcap_close(pcap_t *p)
    關閉p參數相應的文件,并釋放資源。

    void pcap_dump_close(pcap_dumper_t *p)

    5、Libpcap的主要數據結構:
    ?
    Libpcap庫函數所必須的數據結構定義主要包含在pcap.h和pcap-int.h兩個頭文件中。其主要數據結構

    如下:
    ?
    (1)pcap結構
    ?
    pcap結構在pcap-int.h頭文件中被定義:
    ?
    struct pcap
    {
    ??? int??????????????? fd;
    ??? int??????????????? snapshot;
    ??? int??????????????? linktype;
    ??? int??????????????? tzoff;??? /* timezone offset?????????????????????????????????? */
    ??? int??????????????? offset;?? /* offset for proper alignment?????????????????????? */
    ??? struct pcap_sf???? sf;
    ??? struct pcap_md???? md;
    ??? int??????????????? bufsize;? /* Read buffer?????????????????????????????????????? */
    ??? u_char *?????????? buffer;
    ??? u_char *?????????? bp;
    ??? int??????????????? cc;
    ??? u_char *?????????? pkt;????? /* Place holder for pcap_next()????????????????????? */
    ??? struct bpf_program fcode;??? /* Placeholder for filter code if bpf not in kernel. */
    ??? char?????????????? errbuf[PCAP_ERRBUF_SIZE];
    };
    ?
    (2)bpf_program結構
    ?
    該結構在pcap_compile()函數中被使用,在bpf.h頭文件中定義。
    ?
    /usr/include/net/bpf.h

    /* Structure for BIOCSETF. */
    struct bpf_program
    {
    ??? u_int???????????? bf_len;
    ??? struct bpf_insn * bf_insns;
    };

    /*
    * The instruction data structure.
    */
    struct bpf_insn
    {
    ??? u_short?? code;
    ??? u_char??? jt;
    ??? u_char??? jf;
    ??? bpf_int32 k;
    };
    ?
    (3)pcap_pkthdr結構
    ?
    /usr/include/pcap.h

    /*
    * Each packet in the dump file is prepended with this generic header.
    * This gets around the problem of different headers for different
    * packet interfaces.
    */
    struct pcap_pkthdr
    {
    ??? struct timeval ts;????? /* time stamp??????????????????? */
    ??? bpf_u_int32??? caplen;? /* length of portion present???? */
    ??? bpf_u_int32??? len;???? /* length this packet (off wire) */
    };

    /usr/include/net/bpf.h

    /*
    * Structure prepended to each packet.
    */
    struct bpf_hdr
    {
    ??? struct timeval bh_tstamp;?? /* time stamp???????????????? */
    ??? bpf_u_int32??? bh_caplen;?? /* length of captured portion */
    ??? bpf_u_int32??? bh_datalen;? /* original length of packet? */
    ??? u_short??????? bh_hdrlen;?? /* length of bpf header (this struct
    ?????????????????????????????????? plus alignment padding)??? */
    };
    ?
    (4)pcap_stat結構
    ?
    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 XXX not yet supported */
    };

    int main()
    {
    ??????? bpf_u_int32 localnet,netmask;
    ??????? struct bpf_program fcode;
    ??????? pcap_handler printer;

    ??????? pcap_dumper_t*p;
    ??????? char ebuf[PCAP_ERRBUF_SIZE];
    ??????? char * device;
    ??????? u_char * pcap_userdata;
    ??????? pcap_t * pd;
    ??????? int dev_flag=1;
    ??????? int cap_len=CAP_LEN;
    ??????? int i;

    ??????? device=pcap_lookupdev(ebuf);
    ??????? if (device == NULL)
    ??????????????? exit(printf("%s n", ebuf));
    ??????? #ifdef _DEBUG_
    ??????? printf("device is %s \n",device);
    ??????? #endif
    ??????? pd=pcap_open_live(device,cap_len,dev_flag,1000,ebuf);
    ??????? if(pd == NULL)
    ??????????????? exit(printf("%s\n",ebuf));

    ??????? i=pcap_snapshot(pd);
    ??????????????? if(cap_len < i) {
    ??????????????? printf("snaplen raised from %d to %d \n", cap_len, i);
    ??????????????????????? cap_len=i;
    ??????????????? }
    ??????? if(pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
    ??????????????????????? localnet=0;

    ??? netmask=0;
    ??????????????????????? printf("%s\n", ebuf);
    ??????? }
    ??????? if (pcap_compile(pd, &fcode, "", 1, netmask) < 0)
    ??????????????? exit(printf("Error %s\n","pcap_compile"));
    ??????? if (pcap_setfilter(pd,&fcode) < 0)
    ??????????????? exit(printf("Error %s\n","pcap_setfilter"));

    ??????? p=pcap_dump_open(pd,FILENAME);
    ??????????????? if(p == NULL)
    ??????????????????????? exit(printf("Error:%s\n","pcap_dump_open"));
    ??????????????? printer=pcap_dump;
    ??????????????? pcap_userdata=(u_char *)p;

    ??????? if(pcap_loop(pd, -1, printer, pcap_userdata) < 0)
    ??????????????? exit(printf("Error, %s\n","pcap_loop"));

    ??????? pcap_close(pd);
    ??????? exit(0);
    }

    ?

    posted on 2007-08-24 21:07 allic 閱讀(2401) 評論(0)  編輯  收藏 所屬分類: TCP/IP 開發
    主站蜘蛛池模板: 免费成人激情视频| 免费无码黄网站在线看| 免费观看的a级毛片的网站| 国产AⅤ无码专区亚洲AV| 白白色免费在线视频| 四虎在线播放免费永久视频 | 亚洲国产成人片在线观看| 国产成人无码免费看片软件 | 免费国产在线观看老王影院| 亚洲天然素人无码专区| 免费av欧美国产在钱| 亚洲欧美自偷自拍另类视| 在线免费观看污网站| 黄色毛片视频免费| 亚洲综合无码AV一区二区| 中文字幕不卡免费视频| 亚洲va久久久噜噜噜久久| 91成人在线免费视频| 国产公开免费人成视频| 曰批全过程免费视频免费看| 精品国产亚洲男女在线线电影 | 久久丫精品国产亚洲av| 一个人在线观看视频免费| 相泽南亚洲一区二区在线播放| 免费很黄很色裸乳在线观看| 成人网站免费大全日韩国产| 久久丫精品国产亚洲av| 大学生一级特黄的免费大片视频 | 手机在线免费视频| xxxxxx日本处大片免费看| 婷婷精品国产亚洲AV麻豆不片 | 亚洲午夜久久久精品影院| 日韩精品无码区免费专区| 老司机精品视频免费| 亚洲国产精久久久久久久| 免费a级毛片高清视频不卡| 国产精品极品美女自在线观看免费| 亚洲国产精品国自产拍AV| 成人黄动漫画免费网站视频 | 亚洲精品无码av片| 亚洲精品蜜桃久久久久久|