Winpcap捕获数据包并转发

WinPcap是一个重要的抓包工具,它是libpcap的Windows版本。
关于WinPcap的介绍、安装与配置,之后我会单独写一篇文章,这里先介绍下使用Winpcap函数能完成的基本功能:捕获数据包并转发。

首先来看几个函数:
int pcap_findalldevs_ex(char * source, struct pcap_rmtauth * auth,pcap_if_t ** alldevs, char * errbuf)
这个函数可以列出本地机器上的设备,还可以列出远程机器上的设备

网卡信息

struct pcap_if {

            struct pcap_if *next;

            char *name;

            char *description;

            struct pcap_addr *addresses;

            u_int flags; }可以用pcap_if_t代替pcap_if

每一个包的包头和数据

struct pcap_pkthdr {

  structtimeval ts;

  bpf_u_int32caplen;

  bpf_u_int32len;

}

ts:时间戳     ; cpalen:当前分组的长度   ; len:数据包的长度。

pcap_t*pcap_open (constchar * source, int  snaplen, int flags,int read_timeout, struct pcap_rmtauth * auth, char * errbuf)

此函数用于为捕获/发送数据打开一个普通的源。
参数:
source:包含要打开的源名称的字符串。
read_timeout:以毫秒单位。readtimeout用来设置在遇到一个数据包的时候读操作不必立即返回,而是等待一段时间,让更多的数据包到来后从OS内核一次读多个数据包。并非所有的平台都支持readtimeout;在不支持readtimeout的平台上将被忽略。
snaplen:需要保留的数据包的长度。对每一个过滤器接收到的数据包,第一个‘snaplen’字节的内容将被保存到缓冲区,并且传递给用户程序。例如,snaplen等于100,那么仅仅每一个数据包的第一个100字节的内容被保存。简言之就是从每一个包的开头到snaplen的那段内容将被保存。
flags:保存一些由于抓包需要的标志。PCAP_OPENFLAG_PROMISCUOUS定义了适配器(网卡)是否进入混杂模式(promiscuous mode),当要捕获数据包时,就使用这个标志。
auth:一个指向’struct pcap_rmtauth’的指针,保存当一个用户登录到某个远程机器上时的必要信息。假如不是远程抓包,该指针被设置为NULL

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)  
此函数用于捕获数据包,其中,cnt指定了捕获数据包的最大数目,pcap_handler是个回调函数。

int pcap_sendpacket (pcap_t* p,  u_char* buf,  int  size)

此函数用于发送一个原始数据包(raw packet)到网络上。

其中,p是用来发送数据包的那个接口,buf包含着要发送的数据包的数据(包括各种各样的协议头),

size是buf所指的缓冲区的尺寸,也就是要发送的数据包的大小。MAC循环冗余码校验不必被包含,因为它很容易被计算出来并被网络接口驱动添加。如果数据包被成功发送,返回0;否则,返回-1。


下图为捕获数据包并转发的流程图,其中转换时间戳格式和发送数据包使用了回调函数的方式完成。(我承认我没怎么画过流程图,一定很坑,不过领会精神就好了=。=)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值