其实,基于winpcap的网络分析程序已经遍地开花了,现在写这些似乎挺落伍的。而且,.net下的winpcap编程也有人已经做了封装,只是思路和我的不大一样。
但是无论怎么说,也是捣鼓了一阵子。多少有些心得,就一点一点写下来好了。程序的完整代码,等文章全写完了再发表好了。
我的思路是这样滴:用vc++.net对winpcap进行封装,实现数据包的抓取和解析,然后再通过c#进行调用,完成网络分析等功能。这一次,就说说我是如何用vc++.net对winpcap进行封装。
首先说下为什么要用vc++.net。在c#下面用DllImport不是很方便么?嗯,没错。事实上,我见到的那个老外用.net封装winpcap就是这么做的。这样做没有问题,也没有什么多少性能上的问题。
只是呢,因为我以前遇到过一次类似的问题,也是调用c的库,用DllImport搞完之后,总是出超级奇怪的问题。无奈之下,只好用vc++.net做了个桥。因为它向下能c,向上能.net,真是太好不过了。这一次,我也是为了避免出现以前的那个问题,就直接用了vc++.net。
好了,不废话了,正题开始:
首先建立一个vc++.net的类库(真是废话呀,呵呵),我起的名字是NetDriver。然后把下载到的winpcap解压,将里面的lib和include都拷贝到NetDriver文件夹下面。
接下来要修改一下项目属性。一个地方是要把“优化”关闭,因为优化之后的程序跑起来总是出错。另一个就是在附加依赖项里面,添加对lib文件夹下面的两个lib库的引用。
接下来,在NetDriver.h里面添加对winpcap的引用:
#include "include/pcap.h"
编译……呵呵,失败了吧。成功就奇怪了!!(不要咬我)
接着去include下面找到pcap.h文件,进行下面的修改:
第41行:将#include 改成 #include “pcap-stdinc.h”
第51行:将#include 改成 #include “pcap-bpf.h”
将第87行typedif struct pcap pcap_t删除,并在原来位置添加下面两行:
typedef int pcap;//这样改是因为pcap是个内部结构,上层直接调用会失败。反正是指针,用int代替就可以了。
typedef pcap pcap_t;
再编译……怎么,还失败了?那就不是我的问题了。看看是不是把NetDriver文件夹放在了中文路径下面。如果是就得换个地方了。(还有就是不要忘记安装winpcap啊!)老外歧视咱们中国人,shit!!目前也只能忍了。
到这里,就可以在vc++.net下面使用winpcap库了。用法,官方的教程就已经足够清楚了,我下回简单说说好了。这次就到这了。
但是无论怎么说,也是捣鼓了一阵子。多少有些心得,就一点一点写下来好了。程序的完整代码,等文章全写完了再发表好了。
我的思路是这样滴:用vc++.net对winpcap进行封装,实现数据包的抓取和解析,然后再通过c#进行调用,完成网络分析等功能。这一次,就说说我是如何用vc++.net对winpcap进行封装。
首先说下为什么要用vc++.net。在c#下面用DllImport不是很方便么?嗯,没错。事实上,我见到的那个老外用.net封装winpcap就是这么做的。这样做没有问题,也没有什么多少性能上的问题。
只是呢,因为我以前遇到过一次类似的问题,也是调用c的库,用DllImport搞完之后,总是出超级奇怪的问题。无奈之下,只好用vc++.net做了个桥。因为它向下能c,向上能.net,真是太好不过了。这一次,我也是为了避免出现以前的那个问题,就直接用了vc++.net。
好了,不废话了,正题开始:
首先建立一个vc++.net的类库(真是废话呀,呵呵),我起的名字是NetDriver。然后把下载到的winpcap解压,将里面的lib和include都拷贝到NetDriver文件夹下面。
接下来要修改一下项目属性。一个地方是要把“优化”关闭,因为优化之后的程序跑起来总是出错。另一个就是在附加依赖项里面,添加对lib文件夹下面的两个lib库的引用。
接下来,在NetDriver.h里面添加对winpcap的引用:
#include "include/pcap.h"
编译……呵呵,失败了吧。成功就奇怪了!!(不要咬我)
接着去include下面找到pcap.h文件,进行下面的修改:
第41行:将#include 改成 #include “pcap-stdinc.h”
第51行:将#include 改成 #include “pcap-bpf.h”
将第87行typedif struct pcap pcap_t删除,并在原来位置添加下面两行:
typedef int pcap;//这样改是因为pcap是个内部结构,上层直接调用会失败。反正是指针,用int代替就可以了。
typedef pcap pcap_t;
再编译……怎么,还失败了?那就不是我的问题了。看看是不是把NetDriver文件夹放在了中文路径下面。如果是就得换个地方了。(还有就是不要忘记安装winpcap啊!)老外歧视咱们中国人,shit!!目前也只能忍了。
到这里,就可以在vc++.net下面使用winpcap库了。用法,官方的教程就已经足够清楚了,我下回简单说说好了。这次就到这了。