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

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



«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


登录

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


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

我的分类

日志更新

最新评论

留言板

Blog信息

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




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

binaryluo 发表于 2006/1/28 15:30:51

转载请注明原文出处:http://blogger.org.cn/blog/more.asp?name=binaryluo&id=11458 说明:本系列文章是我阅读winpcap手册后整理的一个学习笔记。文章中出现的所有代码是我根据winpcap手册中的示例代码进行了学习,并调试通过,其中对部分代码作了修改,关于代码的版权我尊重winpcap手册中的版权说明,如果你使用了本系列文章中的代码而引起任何的版权或造成安全威胁等问题,我将不负任何责任。        下载好了WpdPack_3_2_alpha1.zip(下载地址:http://www.winpcap.org/install/bin/WpdPack_3_2_alpha1.zip),解压后除了有文档,例子外还有Include和lib,于是想用TC2来做开发环境,但是编译的时候老是出问题,于是放弃。后来阅读了Winpcap手册后才知道因为是在windows上开发,所以它推荐用VC++6.0,于是改用VC。     第一个试验是: #include <pcap.h>#include <remote-ext.h> int main() { pcap_if_t *alldevs; pcap_if_t *d; int i = 0; char errbuf[PCAP_ERRBUF_SIZE];  /* Retrieve the device list from the local machine*/ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1) {  printf("Error in pcap_findalldevs_ex: %s\n", errbuf);  exit(1); }  /* Print the list */ for (d = alldevs; d != NULL; d = d->next) {  /* Print the device's name */  printf("%d. %s", ++ i, d->name);   /* Print the device's dscription */  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 0; }  /* We don't need any more the device list. Free it */ pcap_freealldevs(alldevs);  return 1;}        编译的时候又遇到问题——“无法打开pcap.h”。又查看开发手册才找到解决方法: 1.安装Winpcap驱动。下载地址:http://www.winpcap.org/install/bin/WinPcap_3_1.exe。 2.将Winpcap的Include,Lib目录添加进VC6.0的环境变量中; 3. 针对每一个项目,先用VC打开项目,然后在"Project->Settings",标签栏出选择"C/C++",在"Preprocessor definitions"的输入框里添加"WPCAP",再选择"Link",在"Object/library modules"的输入框里添加"wpcap.lib Packet.lib"。        再编译时终于OK了。之后,阅读代码并查看开发手册学到了下面的东西: pcap_if是一个结构体,具体点它是一个链表的结点,他的定义如下: struct pcap_if { struct pcap_if *next; char *name; char *description; struct pcap_addr *addresses; u_int flags; }     另外,在pcap.h中有一句“typedef struct pcap_if pcap_if_t;”,所以也可以用pcap_if_t代替pcap_if。 int pcap_findalldevs_ex(char * source, struct pcap_rmtauth * auth, pcap_if_t ** alldevs, char * errbuf )     这个函数是’pcap_findalldevs()’的一个超集。’pcap_findalldevs()’比较老,他只允许列出本地机器上的设备。然而,’pcap_findalldevs_ex()’除了可以列出本地及其上的设备,还可以列出远程机器上的设备。此外,它还能列出所有可用的pcap文件到指定的文件夹。’pcap_findalldevs_ex()’是平台无关的,然而它以来于标准的’pcap_findalldevs()’来获得本地机器的地址。 


阅读全文(27672) | 回复(22) | 编辑 | 精华
 


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

binaryluo发表评论于2006/2/24 23:11:02

以下引用feiyu_lili(游客)在2006-2-24 14:52:58的评论:’pcap_findalldevs_ex()’除了可以列出本地及其上的设备,还可以列出远程机器上的设备。 那怎么知道是本地的还是远程的呢? 有什么区别呢?第 一个问题:却别是本地还是远程是由pcap_findalldevs_ex()的第一个参数(source)决定的,source指定所要监控的网络适配 器。它有特定的“source语法”。pcap_findalldevs_ex()支持的source语法有一下几种:    file://folder/[列出指定文件夹中的所有文件]    rpcap:// [列出所有本地的适配器]    rpcap://host:port/ [列出远程主机上的可用的设备] 其中,'host'和'port'参数既可以是数字形式(numeric),又可以是字符形式(literal),下面形式都是合法的:   host (字符):例如: host.foo.bar   host (数字 IPv4): 例如: 10.11.12.13   host (IPv6型的IPv4数字形式): 例如: [10.11.12.13]   host (数字 IPv6): 例如: [1:2:3::4]   port: 也可以是数字 (例如:'80') 或字符 (例如: 'http') 下面举一些实际例子:  rpcap://host.foo.bar/devicename [全部都是字符形式的,没有端口号]  rpcap://host.foo.bar:1234/devicename [全部都是字符形式的,有端口号]  rpcap://10.11.12.13/devicename [IPv4 的数字形式,没有端口号]  rpcap://10.11.12.13:1234/devicename [IPv4 的数字形式,有端口号]  rpcap://[10.11.12.13]:1234/devicename [IPv6格式的IPv4数字形式 ,有端口号]  rpcap://[1:2:3::4]/devicename [IPv6数字形式,没有端口号]  rpcap://[1:2:3::4]:1234/devicename [IPv6数字形式,有端口号]  rpcap://[1:2:3::4]:http/devicename [IPv6数字形式,端口号是字符形式] 另外,在Winpcap里,字符串"file://"和字符串"rpcap://"都被宏定义过:   #define PCAP_SRC_FILE_STRING "file://"   #define PCAP_SRC_IF_STRING "rpcap://" 所以也可以用宏名来代替它们。 第二个问题:列出本地适配器跟远程适配器的区别(作用),本地的就不多说了,这是Winpcap的基本功能的体现;而列出远程的可用的适配器,就可以建立 一个到该远程主机的控制连接,就可以使用该主机上存在的套结字,说通俗点就是可以通过远程主机上的适配器连接到该主机上并对该主机进行控制。  


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


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

binaryluo发表评论于2006/2/24 22:21:01

以下引用feiyu_lili(游客)在2006-2-24 11:46:49的评论:那在Microsoft Visual Studio .NET 2003下面怎么添加库,才能打开pcap.h呢我用的是VC++6.0,VS.NET没试过。你可以参考着VC++6.0的设置方式试下看看。 

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


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

feiyu_lili(游客)发表评论于2006/2/24 14:52:58

’pcap_findalldevs_ex()’除了可以列出本地及其上的设备,还可以列出远程机器上的设备。 那怎么知道是本地的还是远程的呢? 有什么区别呢? 

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


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

feiyu_lili(游客)发表评论于2006/2/24 11:46:49

那在Microsoft Visual Studio .NET 2003下面怎么添加库,才能打开pcap.h呢 

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


» 1 2 3 4 »

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



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

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