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

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



«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


登录

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


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

我的分类

日志更新

最新评论

留言板

Blog信息

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




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

binaryluo 发表于 2006/2/3 21:31:22

  函数2: int pcap_compile(pcap_t*                    p, struct bpf_program*    fp, char*                          str, int                              optimize, bpf_u_int32                netmask)     编译一个数据包过滤器,将一个能被核心态(kernel-level)过滤器引擎解释的程序中的高层过滤表达式(filtering expression)进行转化。pcap_compile()被用来将字符串str编译进过滤器程序(fp),程序(fp)是一个指向bpf_program结构体并被pcap_compile()赋值的指针。optimize控制是否对目标代码(resulting code)的性能进行优化。Netmask表明IPv4掩码,它仅在检查过滤器程序中的IPv4广播地址的时候被使用。如果网络掩码对于程序是不可知的或者数据包是在Linux的”任何(any)”伪接口上被捕获的,则赋值0;IPv4广播地址的测试将不被正确进行,但过滤器程序中的其他所有的测试都不会有问题。返回-1表示发生了错误,此时,pcap_geterr()将被用来显示错误信息。   函数3: int pcap_setfilter(pcap_t*         p, struct bpf_program* fp)     把一个过滤器同一次抓包关联起来。pcap_setfilter被用来指定一个过滤器程序。fp是一个指向bpf_program结构体的指针,通常是pcap_compile()执行的结果。当失败时返回-1,此时,pcap_geterr()被用来显示错误信息;返回0表示成功。 首先,首先我们设置过滤器为“ip and udp”。用这个方法我们可以确保packet_handler()仅接收IPv4上的UDP数据包:这就简化了解析过程并且提高了程序的效率。     我们还创建了IP和UDP两个结构体,这些结构体被packet_handler()用来定位不同的头域。       packet_handler()展现了像tcpdump/WinDump这些复杂的嗅探器(sniffer)如何解析网络数据包。因为我们不关心MAC头,所以我们跳过它。为了简便起见,抓包前我们用pcap_datalink()检查MAC层,以确保我们处理的是以太网。该方法可以确保MAC头是14字节。       IP头的定位在MAC头定位之后。我们从IP包头中取出源IP地址和目标IP地址。 展开UDP包头有点复杂,因为IP包头不是定长的。因此,我们使用IP包头的长度域来获得它的大小。一旦我们知道了UDP头的位置,我们可以取出源端口和目的端口。 


阅读全文(13413) | 回复(7) | 编辑 | 精华
 


我有不明白的地方,能否再指教一下能?
原创空间,  随笔,  读书笔记,  心得体会,  软件技术,  电脑与网络

feiyu_lili发表评论于2006/2/27 15:04:48

你代码中计算长度有以下代码: ih = (ip_header*)(pkt_data + 14); ip_len = (ih->ver_ihl & 0xf) * 4; uh = (udp_header*)((u_char*)ih + ip_len);   ih = (ip_header*)(pkt_data + 14); 这个我能明白,因为你在文中已经指出MAC头是14字节 但下面的2句 ip_len = (ih->ver_ihl & 0xf) * 4; uh = (udp_header*)((u_char*)ih + ip_len); 你虽然也有解释:“IP头的定位在MAC头定位之后。我们从IP包头中取出源IP地址和目标IP地址。 展开UDP包头有点复杂,因为IP包头不是定长的。因此,我们使用IP包头的长度域来获得它的大小。”但是我还是不明白,为什么要这么做,你能不能解释的具体一点呢?有相关资料能不能发到我邮箱呢? 我的邮箱:feiyu_lili163.com 非常感谢~ 


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


» 1 2 »

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



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

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