winpcap常用函数解析

本文详细介绍了WinPcap库在网络编程中的应用,包括获取网卡列表、捕获与发送数据包等功能函数的使用方法及示例代码。特别强调了pcap_loop与pcap_dispatch的区别及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://blog.youkuaiyun.com/neu_caoyuan/article/details/7304045

1. int pcap_findalldevs(pcap_if_t **, char *)
    说明:用来获得网卡的列表
    参数:指向pcap_if_t**类型的列表的指针的指针;>     {
     > {
   >            65536, // portion of the packet to capture. 65536 grants that the whole packet will be captured on all the MACs.
                        1,         // 混杂模式
                1000,      // 设置超时时间,亳秒为单位
               >     {
       > "\nUnable to open the adapter. %s is not supported by WinPcap\n");
        pcap_freealldevs(alldevs);
        return -1;

4. int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);
说明:捕获数据包;不会响应pcap_open_live()中设置的超时时间
参数:
        p是由pcap_open_live()返回的所打开网卡的指针
        cnt用于设置所捕获数据包的个数
        packet_handler是与void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)配合使用的一个参数。回调函数。 
        user值一般为NULL
举例:
pcap_loop(adhandle, 0, packet_handler, NULL);
void> strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);

}
5. int pcap_dispatch(pcap_t * p, int cnt, pcap_handler, u_char *user)
说明:捕获数据包。可以不被阻塞
参数:与pcap_loop()相同
pcap_dispatch(...)和pcap_loop(...)的比较:
    一旦网卡被打开,旧可以调用pcap_dispatch() 或pcap_loop()进行数据的捕获,这两个函数的功能十分相似,不同的是pcap_ dispatch()可以不被阻塞,而pcap_loop()在没有数据流到达时将阻塞。在这个简单的例子里用
pcap_loop()就足够了,而在一些复杂的程序里往往用pcap_dispatch()。这两个函数都有返回的参数,一个指向某个函数(该函数用来接受数据如该程序中的packet_handler)的指针
,libpcap调用该函数对每个从网上到来的数据包进行处理和接收数据包。另一个参数是带有时间戳和包长等信息的头部,最后一个是含有所有协议头部数据报的实际数据。注意MAC的冗余校验码一般不出现,因为当一个桢到达并被确认后网卡就把它删除了,同样需要注意的是大多数网卡会丢掉冗余码出错的数据包,所以WinPcap一般不能够捕获这些出错的数据报。

6. int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, u_char **pkt_data);
说明:捕获数据包,与pcap_ dispatch()   pcap_loop()很相似。pcap_next_ex()允许直接调用来接收包,它的参数和pcap_loop()相同:有一个网卡描述副,和两个指针,这两个指针会被初始化并返回给用户,一个是pcap_pkthdr结构,另一个是接收数据的缓冲区。
参数:
       p是由pcap_open_live()返回的所打开网卡的指针
       pcap_pkthdr型的结构体,存储时间,包的长度
        pkt_data存储数据包的内容,为一个char型数组
struct pcap_pkthdr
{
        struct timeval ts;       
        bpf_u_int32 caplen;       
        bpf_u_int32 len;       
};
返回值:当等于1时成功;等于0时超时;等于-1时说明发生错误,错误信息用pcap_geterr(adhandle)获得
举例:(最重要的一段代码)
#define LINE_LEN 16
main(int>         char errbuf[PCAP_ERRBUF_SIZE];
       >                 {
                       >                 {
                       >                 {
                        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
                        return -1;
                }
                printf("Enter the interface number (1-%d):",i);
                scanf("%d", &inum);
                if(inum < 1 || inum > i)    //选择网卡
                {
                       >跳转到指定的网卡
                 if ( (fp= pcap_open_live(d->name, 100, 1, 20, errbuf) ) == NULL)
                {
                        fprintf(stderr,"\nError opening adapter\n");
                        return -1;
                }
        }
        else
       {
                 switch (argv[1] [1])  

{      
                    >                                 {
                                       >                                 {
                                       >         {
               >                         continue;
               >                 {
                       >                 }  
               >   {
               >          netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_addr;
 else
         netmask=0xffffff; 
 if(pcap_compile(adhandle, &fcode, "ip> {
   > {
   > "\nError opening adapter: %s\n", error);
   > packet[1]=1;
packet[2]=1;
packet[3]=1;
packet[4]=1;
packet[5]=1;


packet[6]=2;
packet[7]=2;
packet[8]=2;
packet[9]=2;
packet[10]=2;
packet[11]=2;


for(i=12;i<100;i++){
   > }

pcap_sendpacket(fp, packet, 100); //发送原始的数据包
return;
}
10.发送数据包有关的几个函数
pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);
说明:给数据包队列分配空间
参数:
        memsize队列缓冲区的大小
返回值:
       pcap_send_queue指针
struct pcap_send_queue
{
        u_int maxlen;       
        u_int len;                        //< Current size of the queue, in bytes.
        char *buffer;                //< Buffer containing the packets to be sent.
};
举例:
squeue = pcap_sendqueue_alloc(caplen);
int pcap_sendqueue_queue(pcap_send_queue* queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
说明:填充队列
参数:
        queue 是由pcap_sendqueue_alloc()返回的指针
         pkt_header是数据包头
        pkt_data是数据包内容缓冲区指针
返回值:错误是返回-1 
举例:
    if(pcap_sendqueue_queue(squeue, pktheader, pktdata) == -1)
 {
        printf("Warning: packet buffer too small, not all the packets will be sent.\n");
        break;
 }
u_int pcap_sendqueue_transmit(pcap_t *p, pcap_send_queue* queue, int sync)
说明:发送队列数据
参数:
         pcap_t是        pcap_open_live()函数打开的网卡指针
        queue 是由pcap_sendqueue_alloc()返回的指针 
        sync是同步设置。如果非零,那么发送将是同步的,这将站用很大的CPU资源,因为发生在内核驱动的同步发送是通过"brute force" loops的,但是一般情况下能够精确到微秒。
返回值:错误是返回-1
举例:
    if((res = pcap_sendqueue_transmit(outdesc, squeue, sync)) < squeue->len)
    {
       printf("An error occurred sending the packets: %s. Only %d bytes were sent\n", error,res);
 }
void pcap_sendqueue_destroy(pcap_send_queue* queue);
说明:释放队列
参数:
       queue 是由pcap_sendqueue_alloc()返回的指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值