通达学院 专业课程设计II
题 目: 解析IP数据包
专 业 计算机通信 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 计算机学院计算机科学与技术系 日 期 2012.11.12-2012.11.23
同学出勤率(满勤、较高、一般,较低),学习态度(端正、教较端正、一般、较差),程序设计基础(好、较好、一般、较差),演示程序(已经、没有)达到了基本要求,算法设计(好、较好、师一般),界面友好程度(好、较好、一般),答辩过程中回答问题(准确、较准确、错误率较高),撰写报告格式(规范、一般)、内评容(丰满、简单)、表述(清晰、一般、不清楚),(圆满、较好、基本)完成了课题任务。 语 教师签名:
年 月 日 成绩评定 备 注
解析IP数据包
一、 课题内容和要求
课题内容:
本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标
准输出上,并同时写入日志文件。
程序的具体要求如下:
1、捕获网络中的IP数据包;
2、解析数据包,在标准输出和日志文件中写入捕获的IP包的版本、头长度、服
务类型、总长度、标识、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容; 3、程序操作友好、界面美观。
二、概要设计
1、本程序主要由三部分构成:初始化原始套接字,反复监听捕获数据包和解析数据包。
2、为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)编程。但是,要注意的是:通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。
3、流程图如下:
三、详细设计
#include \ #include \ #include \ #include \
#pragma comment(lib, \
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) #define BUFFER_SIZE 65535 /* 定义IP头部数据结构 */ typedef struct _IP_HEADER{
union{
BYTE Version; //版本(前4位)
BYTE HdrLen; //报头标长(后四位),IP头长度 };
BYTE ServiceType; //服务类型 WORD TotalLen; //总长度 WORD ID; //标识 union{ WORD Flags; WORD FragOff; };
BYTE TimeToLive; BYTE Protocol; WORD HdrChksum; DWORD SrcAddr; DWORD DstAddr; BYTE Options; }IP_HEADER;
//逐位解析IP头中的信息,获取版本号 void getVersion(BYTE b,BYTE &version) {
version = b>>4; }