winpcap获取文件

1、打印列表,选择需要用来抓包的网卡

2、pcap_loop(pcap_t * p,int cnt, packet_handle,u_char* user);//用来监听并抓取数据包,p是表示网卡的指针,cnt是抓取包的个数,pcaket_handle是回调函数,可以存储包文件,user是留给用户使用的参数,传递给回调函数,可以为空

3、回调函数

pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content),其中:

(1)packet_content表示抓取到的包的内容,这是一个指针;

(2)argument是从pcap_loop传过来的参数,表示user;

(3)pcap_pkthdr表示抓取到的包的基本信息,包括时间,长度等等:结构体形式如下:

  struct pcap_pkthdr {
  struct timeval ts; /* 时间戳 */
  bpf_u_int32 caplen; /* 已捕获部分的长度 */
  bpf_u_int32 len; /* 该包的脱机长度 */
  };
4、一些小知识
struct tm是c++中表示时间的结构体:
#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。
long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};
#define _TM_DEFINED
#endif
struct tm *ltime;   //系统定义的时间结构体
char timestr[16];
time_t local_tv_sec; //表示秒的时间单位
/* 将时间戳转换成可识别的格式 */
local_tv_sec = header-> ts.tv_sec;   //这里header中有struct timeval结构体,该结构体表示的就是从1970年1-1-0:0:0到现在经过的秒数
ltime=localtime(&local_tv_sec);  //因为tv_sec表示的是经过的秒数,因此需要localtime函数将秒数转化为现在的系统时间
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
 

部分程序代码,写到获取设备信息:

pcap_if_t  //表示网络接口的类型

pcap_t //表示已打开的捕捉实例

 pcap_if_t alldevs;

pcap_if_t d;

pcap_t catch_e;

int i_num=0;

int i=0;

char errbuf[PCAP_ERRBUF_SIZE];  //就是PCAP中表示错误信息的字符串,其中PCAP_ERRBUF_SIZE表示的是一个常量

if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)

{

  fprintf(stderr,"Error occured in finding devices:%s",errbuf); //stderr是系统中的文件流

  exit(-1);

}

for(d=alldevices,d;d=d->next)

{

  fprintf("%d,%s",++i,d->name);

  if(d->description)

    fprintf("%s\n",d->description);

  else

    fprintf("No description available!\n");

}

转载于:https://www.cnblogs.com/wy-chen14/p/7711535.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
标 题: 【原创】基于WinPCap的网络协议开发 - 炮王(超级打炮机)发送数据包(03) 作 者: 加百力 时 间: 2009-05-18,16:55:36 链 接: http://bbs.pediy.com/showthread.php?t=89175 【文章标题】: 基于WinPCap的网络协议开发 - 炮王(超级打炮机)发送数据包(03) 【文章作者】: 加百力 【软件名称】: WinPCap 【下载地址】: http://www.winpcap.org/ 【内部编号】: MASSADA 0029 【编写语言】: C++ 【使用工具】: VS2005 【操作平台】: Windows 2003 -------------------------------------------------------------------------------- 【详细过程】 在第一篇文章中我们提到WinPCap的基本功能之一就是:  1> 在网络上发送原始的数据包。 发送原始数据包难度不大,只需要应用几个简单的函数就可以了。 我编写炮王程序的主要目的是为了测试WinPCap/libpcap的抓包能力,在不同网速和数据包大小的条件下libpcap的抓包率有多少。 炮王特点: 01、可以发送任意协议的数据包。TCP/IP等等。 02、针对每次发包,会返回状态,可以检测是否成功。在程序中如果失败会自动退出。 03、可以随机修改数据包的:源、目的MAC地址,IP地址,端口、数据内容等属性信息。 04、使用多线程发包,在XP下最多可以同时开2000个线程发包,发包速度快,流量大。在千兆网卡上可以超过15M/s的速度。 05、自动统计发包时间,计算每秒发包数量,流量。 06、可以设置发包的时间间隔,最少到1毫秒。 炮王使用方法: 首先直接运行pw.exe可以看到程序提示的参数信息和显示的当前可用网卡信息。可用网卡信息会保存在CardsInfo.txt文件中。 打开BAT脚本,修改网卡信息,即可。 运行脚本,脚本将数据包文件发送出去。 注意:总的发包数量等于每个线程的发包数量乘以线程总数。 实验的数据包文件都是MSN消息。 具体代码请看附件。 -------------------------------------------------------------------------------- 【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值