注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

pcap  

2012-06-20 15:45:43|  分类: 名词解释 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

packet capture library抓包库

  这个抓包库给抓包系统提供了一个高层次的接口。所有网络上的数据包,甚至是那些发送给其他主机的,通过这种机制,都是可以捕获的。它也支持把捕获的数据包保存为本地文件和从本地文件读取信息。

工作流程

1.打开网络接口

  这一步需要告诉程序我们的网卡接口,或者让程序自己检测。
  下面这段程序检测系统中所有可用的网卡接口并且逐一打印名称和描述信息。
  注意:由于是底层的系统调用,所以需要root权限。否则系统会检测不到网卡。
  pcap_findalldevs();
  代码:
  #include <pcap.h>
  #include <stdlib.h>
  #include <stdio.h>
  int main(int argc, char *argv[])
  {
  pcap_if_t *alldevs;
  pcap_if_t *device;
  char errbuf[PCAP_ERRBUF_SIZE];
  if(pcap_findalldevs(&alldevs, errbuf) == -1)
  {
  fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
  exit(EXIT_FAILURE);
  }
  device = alldevs;
  for(; device != NULL; device = device->next)
  {
  printf("Device name: %s\n", device->name);
  printf("Description: %s\n", device->description);
  }
  /* 不再需要设备列表了,释放它 */
  pcap_freealldevs(alldevs); 
  return 0;
  }
  个人不推荐用,官方也不推荐用pcap_lookupdev()来找网卡,windows 环境推荐 pcap_findalldevs_ex() 。

2.初始化

3.设置捕获规则

  打开文件句柄使用
  pcap_t *handle;
  handle = pcap_open_live(device, 1000, 1, 1000, errbuf);
  if(handle == NULL)
  {
  fprintf(stderr, "Open device : %s failed: %s\n", device, errbuf);
  exit(EXIT_FAILURE);
  }
  sprintf(filter_exp, "ether dst//这里是mac地址: %02x:%02x:%02x:%02x:%02x:%02x"
  " and ether proto 0x8812//这里是protocol协议",
  mac[0],mac[1],
  mac[2], mac[3],
  mac[4], mac[5]);
  //编译规则
  if (pcap_compile(handle, &fp, filter_exp, 0, 0) == -1) {
  fprintf(stderr, "Couldn't parse filter %s: %s\n",
  filter_exp, pcap_geterr(handle));
  exit(EXIT_FAILURE);
  }
  //应用规则
  if (pcap_setfilter(handle, &fp) == -1) {
  fprintf(stderr, "Couldn't install filter %s: %s\n",
  filter_exp, pcap_geterr(handle));
  exit(EXIT_FAILURE);
  }
  pcap_freecode(&fp);
  pcap_freealldevs(alldevs);
  pcap_setfilter();

4.开始进入抓包循环

  pcap_loop();

5.关闭会话

  pcap_close();  这个抓包库给抓包系统提供了一个高层次的接口。所有网络上的数据包,甚至是那些发送给其他主机的,通过这种机制,都是可以捕获的。它也支持把捕获的数据包保存为本地文件和从本地文件读取信息。

工作流程

1.打开网络接口

  这一步需要告诉程序我们的网卡接口,或者让程序自己检测。
  下面这段程序检测系统中所有可用的网卡接口并且逐一打印名称和描述信息。
  注意:由于是底层的系统调用,所以需要root权限。否则系统会检测不到网卡。
  pcap_findalldevs();
  代码:
  #include <pcap.h>
  #include <stdlib.h>
  #include <stdio.h>
  int main(int argc, char *argv[])
  {
  pcap_if_t *alldevs;
  pcap_if_t *device;
  char errbuf[PCAP_ERRBUF_SIZE];
  if(pcap_findalldevs(&alldevs, errbuf) == -1)
  {
  fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
  exit(EXIT_FAILURE);
  }
  device = alldevs;
  for(; device != NULL; device = device->next)
  {
  printf("Device name: %s\n", device->name);
  printf("Description: %s\n", device->description);
  }
  /* 不再需要设备列表了,释放它 */
  pcap_freealldevs(alldevs); 
  return 0;
  }
  个人不推荐用,官方也不推荐用pcap_lookupdev()来找网卡,windows 环境推荐 pcap_findalldevs_ex() 。

2.初始化

3.设置捕获规则

  打开文件句柄使用
  pcap_t *handle;
  handle = pcap_open_live(device, 1000, 1, 1000, errbuf);
  if(handle == NULL)
  {
  fprintf(stderr, "Open device : %s failed: %s\n", device, errbuf);
  exit(EXIT_FAILURE);
  }
  sprintf(filter_exp, "ether dst//这里是mac地址: %02x:%02x:%02x:%02x:%02x:%02x"
  " and ether proto 0x8812//这里是protocol协议",
  mac[0],mac[1],
  mac[2], mac[3],
  mac[4], mac[5]);
  //编译规则
  if (pcap_compile(handle, &fp, filter_exp, 0, 0) == -1) {
  fprintf(stderr, "Couldn't parse filter %s: %s\n",
  filter_exp, pcap_geterr(handle));
  exit(EXIT_FAILURE);
  }
  //应用规则
  if (pcap_setfilter(handle, &fp) == -1) {
  fprintf(stderr, "Couldn't install filter %s: %s\n",
  filter_exp, pcap_geterr(handle));
  exit(EXIT_FAILURE);
  }
  pcap_freecode(&fp);
  pcap_freealldevs(alldevs);
  pcap_setfilter();

4.开始进入抓包循环

  pcap_loop();

5.关闭会话

  pcap_close();

 

http://baike.baidu.com/view/6584893.htm

  评论这张
 
阅读(1262)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016