• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • [C]libpcap函數庫說明

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    libpcap獲取數據包函數庫說明 --[[ libpcap ]]------------------------------------------ libpcap的英文意思是 Packet Capture library,即數據包捕獲函數庫。該庫提供的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_looku.net()函數調用的網絡

              設備名指針。如果函數出錯,則返回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結構

              的指針,和一個數據包大小的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)

    __________________________________________________________________________________________________________________________

    #include
    #include
    #define CAP_LEN 2048
    #define FILENAME "rh"
    #define _DEBUG_

    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);
    }

              關閉相應的被打開文件。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>