一、概要说明
1.1 目的要求
监控本地网络,捕获一段时间内以本机为源或目的地址的IP数据包,统计IP数据包的信息,列出本机到相同目的地址或同一源地址到本机且数据包协议类型相同的数据包的数量。通过编写程序,了解IP数据包的结构以及IP数据包头部各字段的含义,理解和认识IP协议的工作原理,掌握使用原始套接字(Raw Socket)编程的方法。
1.2 开发平台
1.2.1 操作系统:Windows XP (sp2)
1.2.2 开发语言:C++语言
1.2.3 开发工具:VC 6.0
l 二、相关知识介绍
2.1 捕获数据包的实现原理
在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了:将网卡设置为混杂模式。这样,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断。
2.2 raw socket的作用
主要在三个方面:
1.通过raw socket来接受发向本机的ICMP,IGMP协议包,或者用来发送这些协议包。
2.接受发向本机的但TCP/IP栈不能够处理的IP包。
3.用来发送一些自己制定源地址特殊作用的IP包(自己写IP头,TCP头等等)
三、程序设计思路
首先初始化环境,再创建原始socket及其初始化;然后获得本地地址,把原始socket绑定到本地网卡,再设置sock_raw为SIO_RCVALL,以便接收所有的IP包;最后监听网卡捕获IP包,把捕获到的包加入链表,在达到预定时间时退出监听并输出统计信息。
原始代码如下
view plaincopy to clipboardprint?
/*********************************************
*文件名称:IPMonitor.cpp
*作 者:南开大学-余下
*摘 要:监控本地网络,捕获一段时间内以本机为
源或目的地址的IP数据包,统计IP数据包
的信息,列出本机到相同目的地址或同一
源地址到本机且数据包协议类型相同的数
据包的数量
*完成日期:2006-11-03
*最后修改:2006-11-06
*********************************************/
#include<afxdisp.h>
#include<iostream.h>
#include<winsock2.h>
#include<ws2tcpip.h>
#pragma comment(lib,"WS2_32.lib")
#define BUFFER_SIZE 65535
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)
//IP头结点
struct ipHeader
{