分享

libpcap入门--Ying is not gem!

 Kxing 2006-03-03

<Kxing 原创,水平有限、欢迎批评和指正。如需转载请注明作者与出处>

    libpcap是一个C语言库,其功能是通过网卡抓取网络以太网中的数据包,在windows系统下有相应的winpcap库。

    要想使用这个库自然先要知道它在哪里,怎么安装就不废话了。在/usr/local/lib下有libpcap.a和libpcao.so,在/usr/local/include下有pcap.h,打开手册的命令是man pcap,而不是man libpcap,如果觉得在字符模式下查看man太麻烦也可以baidu或者google一下"man pcap"会又可读性更高的手册。要写一个使用libpcap的程序只需要在代码中加上#i nclude <pcap.h>,然后在编译时使用-lpcap选项就可以了,例如:

    $>gcc -o test1 test1.c -lpcap

    如果能正确的编译通过使用libpcap的代码,那么便可以进入第二步了,写一个最简单的抓包程序。

    先来介绍第一个类型:pcap_t。要抓包就要首先生成一个抓包的描述符(或称句柄),后来的很多操作都需要用这个描述符做参数。pcap_t就是由pcap.h定义的抓包描述符的类型,函数pcap_open_live返回指向该类型的指针:

    pcap_t *pd = pcap_open_live ("eth0", 68, 0, 1000, ebuf);

    其中第一个参数表示用来抓包的设备;第二个参数定义了抓包的最大字节数,如果这个值小于包的大小(如定义为68,包大于68),那么则只抓这个包的前68个字节;第三个参数把网卡设置为混杂模式,以便抓取以太网中的数据包;第四个参数是一个以毫秒为单位的读取超时时间,如果设置为0则超时时间为无限大;第五个参数为出错信息,需要这样声明(第一个简单的程序不需要出错处理,只知道这样声明就够了):

    char ebuf[PCAP_ERRBUF_SIZE];

    好了,现在生成了一个描述符了,现在我们可以用它来做一点什么事情了。开始一个抓包的循环,然后关闭抓包过程(释放描述符):

    pcap_loop (pd, 7, printer, NULL);

    pcap_close (pd);

    这里的pd就是我们刚刚生成的描述符;pcap_loop的第二个参数表示抓多少个包,设置为-1表示不定义数量,抓取所有的包;第三个参数是一个回调函数,每当抓到一个数据包之后程序将自动调用这个函数;第四个参数是一个指针,可以为空,将在下面详细讲解。

    下面我们来详细的实现这个回调函数,使其每抓到一个包则打印一次:

    void printer()
        {
                printf("A packet is captured! ");
                printf(" \n");
                return;
        }

    当程序成功编译以后执行,则每抓到一个包后输出一行"A packet is captured! ",输出7行以后退出程序。

    这样,一个最简单的抓包程序诞生了!
    

参考源码:


/**
libpcap test program

compile command:"$>gcc -o exe_file_name this_file_name -lpcap"

written by Kxing <S.Kxing@gmail.com>
Last Modified 2006-03-02
*/


#i nclude <stdio.h>
#i nclude <pcap.h>

int main (int argc, char* argv[])
{
        /*the printer running when packet have captured*/
        void printer()
        {
                printf("A packet is captured!");
                printf(" \n");
                return;
        }


        /*the error code buf of libpcap*/
        char ebuf[PCAP_ERRBUF_SIZE];
        /*create capture handler of libpcap*/
        pcap_t *pd = pcap_open_live ("eth0", 68, 0, 1000, ebuf);


        /*start the loop of capture, loop 7 times, enter printer when capted*/
        pcap_loop (pd, 7, printer, NULL);

        pcap_close (pd);

        return 0;
}



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多