欢迎访问binary的Blog   虚心使人进步,骄傲使人落后。

          W3CHINA Blog首页    管理页面    写新日志    退出



«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


登录

用户名称:
登陆密码:
密码保存:


联系我
email: binaryluo(at)gmail.com

我的分类

日志更新

最新评论

留言板

Blog信息

 
blog名称:二进制-虚心使人进步,骄傲使人落后。
日志总数:42
评论数量:370
留言数量:88
访问次数:638877
建立时间:2005年2月19日




[网络编程技术]【原创】Winpcap学习:第三天(20060128)
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

binaryluo 发表于 2006/1/28 16:09:20

    今天的试验程序与前天的功能是一样的,只是在捕获数据包的时候前天的程序用的是pcap_loop(),今天的代码用的是pcap_next_ex()。基于pcap_loop()抓包机制的回调很方便而且在某些情况下是一个不错的选择。但是,处理回调有些时候不适用——它使得程序更复杂,尤其是在应用程序与多线程或C++类有关的情况下。而pcap_next_ex()有的时候用起来更加方便。     试验代码3: #include <pcap.h>#include <remote-ext.h> int main() { pcap_if_t* alldevs; pcap_if_t* d; int inum; int i = 0; pcap_t* adhandle; int res; char errbuf[PCAP_ERRBUF_SIZE]; struct tm* ltime; char timestr[16]; struct pcap_pkthdr* header; u_char* pkt_data;  /* Retrieve the device list on the local machine */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) {  fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);  exit(1); }  /* Print the list */ for (d = alldevs; d; d = d->next) {  printf("%d. %s", ++ i, d->name);  if (d->description)  {   printf(" (%s)\n", d->description);  }  else  {   printf(" (No description available)\n");  } }  if (i == 0) {  printf("\nNo interfaces found! Make sure Winpcap is installed.\n");  return -1; }  /* Select an adapter */ printf("Enter the interface number (1 - %d):", i); scanf("%d", &inum);  if (inum < 1 || inum > i) {  printf("\nInterface number out of range.\n");   /* Free the device list */  pcap_freealldevs(alldevs);  return -1; }  /* Jump to the selected adpater */ for (d = alldevs, i = 0; i < inum - 1; d = d->next, ++ i);  /* Open the device */ if ((adhandle = pcap_open(d->name, /* name of the device */         65536, /* portion of the packet to capture */         /* 65536 guarantees that the whole packet will be captured on all the link layers */         PCAP_OPENFLAG_PROMISCUOUS, /* promiscuous mode */         1000,  /* read timeout */         NULL,  /* authentication on the remote machine */         errbuf /* error buffer */ )) == NULL) {   fprintf(stderr, "\nUnable to open the adapter. %s is not supported by Winpcap\n", d->name);    /* Free the devices list */   pcap_freealldevs(alldevs);   return -1; }  printf("\nlistening on %s ...\n",d->description); /* At this point, we don't need any more the device list. Free it */ pcap_freealldevs(alldevs);  /* Retrieve the packets */ while ((res = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0) {  if (res == 0)  {   /* Timeout elapsed */   continue;  }  /* convert the timestamp to readable format */  ltime = localtime(&header->ts.tv_sec);  strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);  printf("%s, %.6d len:%d\n", timestr, header->ts.tv_usec, header->len); }  if (res == -1) {  printf("Error reading the packets: %s\n", pcap_geterr(adhandle));  return -1; }  return 1;} 函数1: pcap_next_ex(pcap_t*                       p,                       struct pcap_pkthdr**   pkt_header,                       const u_char*             pkt_data )     从一个网络接口或离线捕获方式(例如读文件)读取一个数据包。该函数被用来重新获得下一个可用的数据包,没有使用libpcap提供的传统的回调方法。pcap_next_ex用指向头和下一个被捕获的数据包的指针为pkt_header和pkt_data参数赋值。 返回值有下列几种情况: 1,数据包被正确读取 0,pcap_open_live()设置的超时时间到。在这种情况下pkt_header和pkt_data不指向有效数据包 -1,发生错误 -2,离线捕获的时候读取到EOF     我们通常使用pcap_next_ex()而不是pcap_next(),因为pcap_next()有些缺点。首先,pcap_next()效率低,因为它隐藏了回调方法但是还是依赖于pcap_dispatch;第二,它不能检测EOF,所以当从一个文件获取数据包时它不是很有用。   函数2: u_char* pcap_next(pcap_t*                      p, struct pcap_pkthdr*     h )     返回下一个可用的数据包并且返回一个u_char指向该数据包数据部分的指针。如果发生错误或者活动的抓包没有读取到数据包(例如:数据包不能通过包过滤器而被丢弃,或者在支持读超时(read timeout)的平台上在任何数据包到来之前就超时终止,又或者是抓包设备的文件描述符在非阻塞(non-blocking)模式下并且没有数据包可以被读取),或者文件已被读完时返回NULL。不幸的是,没有办法检测是否发生错误。 


阅读全文(29514) | 回复(24) | 编辑 | 精华
 


回复:Winpcap学习:第三天(20060128)
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

bmonkey(游客)发表评论于2008/5/25 23:55:52

 //u_char *pktdata; const u_char *pktdata;//编译报错,需要修改   这样修改就可以了 


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


有个小问题!
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

HelpMe(游客)发表评论于2008/5/5 17:26:44

各位,我有个问题,请帮忙看看,上面那个程序在循环多次抓包以后,内存占用会越来越大,增长的很快,而在pcap_next_ex(adhandle, &header, &pkt_data)中的pkt_data是const char *,是不断变化的,说明此字符串是不断增长的,有什么方法解决这个问题?多谢各位!以下为blog主人的回复: 应该不会啊。pcap_next_ex每次捕获一个数据包存放在pkt_data里边,下次循环捕获数据包的时候pkt_data存放的原来的内容就被覆盖了的。我原来做的时候也没出现内存增长过大的情况啊,我记得当时我的程序占的内存大约就是20M左右。 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Winpcap学习:第三天(20060128)
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

binaryluo发表评论于2006/4/17 10:24:33

以下引用hyboo(游客)在2006-4-12 2:11:29的评论: 麻烦,需要WinPcap user's manual的离线版本,intel@126.com文档已经发到你邮箱,请查收。 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Winpcap学习:第三天(20060128)
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

feiyu_lili发表评论于2006/4/12 17:25:02

以下引用binaryluo在2006-4-12 14:48:20的评论:  以下引用feiyu_lili在2006-4-12 11:12:41的评论:  以下引用lll(游客)在2006-4-10 10:30:06的评论: feiyu_lili师兄你能不能将在.net下手工添加winpcap 的步骤说的详细一点,我添加了没成功,在这向你请教一下。 我的办法比较笨,但我没有找到在工程添加的方法只能先 这样了。 我运行程序他会把报告错误,然后你点那个错误,找到错误是在那一行,比如指向 #include <pcap.h〉    你看看pcap.h外面的是<>还是  #include "pcap.h"  如果是<>就改成" "因为<>不会查找用户自己添加的.h文件。   该好以后你就在工程的树行结构里面的“头文件文件夹”(我用的是日语版本的,我是这么翻译的,应该就是类似的叫法)右键电击追加,选择已存在的文件。把刚报错的.h文件追加进去,就按这种方法一个追加。 最后把 Packet.lib 和瓦wpcap.lib这两个库文件添加进去。   这样应该可以了,你试试吧。Ps不是师哥是师姐^-^  哈哈,叫师兄也还是可以的啊~~~~~~~~~~~ 嘿嘿,也是。 前段时间忙着翻译,考题答辩,没有搞代码,现在重操旧业觉得生疏了很多阿。而且发现很多新的问题,要继续骚扰你了,嘿嘿 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Winpcap学习:第三天(20060128)
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

binaryluo发表评论于2006/4/12 14:48:20

  以下引用feiyu_lili在2006-4-12 11:12:41的评论:  以下引用lll(游客)在2006-4-10 10:30:06的评论: feiyu_lili师兄你能不能将在.net下手工添加winpcap 的步骤说的详细一点,我添加了没成功,在这向你请教一下。 我的办法比较笨,但我没有找到在工程添加的方法只能先 这样了。 我运行程序他会把报告错误,然后你点那个错误,找到错误是在那一行,比如指向 #include <pcap.h〉    你看看pcap.h外面的是<>还是  #include "pcap.h"  如果是<>就改成" "因为<>不会查找用户自己添加的.h文件。   该好以后你就在工程的树行结构里面的“头文件文件夹”(我用的是日语版本的,我是这么翻译的,应该就是类似的叫法)右键电击追加,选择已存在的文件。把刚报错的.h文件追加进去,就按这种方法一个追加。 最后把 Packet.lib 和瓦wpcap.lib这两个库文件添加进去。   这样应该可以了,你试试吧。Ps不是师哥是师姐^-^  哈哈,叫师兄也还是可以的啊~~~~~~~~~~~ 

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Winpcap学习:第三天(20060128)
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

feiyu_lili发表评论于2006/4/12 11:12:41

  以下引用lll(游客)在2006-4-10 10:30:06的评论: feiyu_lili师兄你能不能将在.net下手工添加winpcap 的步骤说的详细一点,我添加了没成功,在这向你请教一下。 我的办法比较笨,但我没有找到在工程添加的方法只能先 这样了。 我运行程序他会把报告错误,然后你点那个错误,找到错误是在那一行,比如指向 #include <pcap.h〉    你看看pcap.h外面的是<>还是  #include "pcap.h"  如果是<>就改成" "因为<>不会查找用户自己添加的.h文件。   该好以后你就在工程的树行结构里面的“头文件文件夹”(我用的是日语版本的,我是这么翻译的,应该就是类似的叫法)右键电击追加,选择已存在的文件。把刚报错的.h文件追加进去,就按这种方法一个追加。 最后把 Packet.lib 和瓦wpcap.lib这两个库文件添加进去。   这样应该可以了,你试试吧。Ps不是师哥是师姐^-^   

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 2 3 4 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.266 second(s), page refreshed 144776710 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号