解析IP数据包
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图2-1 程序结构图
1.1. 程序流程
根据分析后的程序结构图设计出相应的流程图。内容主要包括初始 化,获得主机IP列表,绑定Socket,开始捕获数据,分析数据,显示数 据项,导出日志文件,根据用户操作退出程序。
图2-2 流程图
第3章 程序实现
2. 类设计声明
根据程序的结构,将程序需要实现的功能细化为相应的类属性和 成员函数。程序有两个类,一个RawSocket类,用于数据包相关捕获和 处理。一个EventArgs类,用于类间传递信息。同时还有一个公共结构 体,对应IP数据包的格式。
解析出各个字段信息,显示在窗口中。
基本要求: 选定本机IP后,程序捕获经过对应网卡的IP
数据报,根据IP数据报的结构,拆分获得各字段 的值,显示在窗口上。同时程序可以将捕获的所 有数据信息导出到日志文件。 参考资料: 《网络协议分析》 寇晓蕤 罗军勇 蔡延荣 机械 工业出版社
完 成 期 限:2011.6.13-2010.6.17 指导教师签名: 课程负责人签名:
程序可以将当前列表的所有数据保存在日志文件里,默认路径为程 序运行目录,以导出时间命名。代码如下: private void toolStripButton2_Click(object sender, EventArgs e) {
string logName = DateTime.Now.ToString("yyyyMMddhhmmss") + ".log";
图3-6
第4章 程序测试
3. 程序测试
经过调试和修改,程序完全实现设计要求,成功抓取了IP数据 包,并分析显示了数据包各字段的信息,达到了这次实训的要求和目 的。
程序正常运行,能够捕获IP数据包,显示数据列表和数据项的详 细信息,并且成功导出到日志文件。
程序欢迎界面如图4-1所示。
图4-1
总结与体会
sw.Write(" " + tr2.Text + Environment.NewLine); } } sw.Write(Environment.NewLine); sw.Close(); fs.Close(); MessageBox.Show("日志保存成功!"); } 结果如图3-5所示。
图3-5
sw.Write(tr1.Text + Environment.NewLine); TreeNode temp = tr1.Nodes[0]; sw.Write(" " + temp.Text + Environment.NewLine); foreach (TreeNode tr2 in temp.Nodes) {
args.DestinationAddress; AddTreeNode addTreeNode = new AddTreeNode(OnAddTreeNode); reeView1.Invoke(addTreeNode, new object[] { rootNode });
} 结果如图3-3所示。
toolStripComboBox1.Items.Add(ip.ToString()); } } 具体结果如图3-2所示。
图3-2
2.4.3. 显示列表
捕获数据后,触发事件,在事件处理函数里,将传递的参数信息添
加到主窗体信息列表里。
void
rawSocket_PacketArrival(object
2.3. Header结构
public struct IPHeader {
public byte ip_verlen;
public byte ip_tos; public ushort ip_totallength; public ushort ip_id; public ushort ip_offset; public byte ip_ttl; public byte ip_protocol; public ushort ip_checksum; public uint ip_srcaddr; public uint ip_destaddr; }
2.4. 主要功能的实现 2.4.1. 程序界面
菜单栏及工具栏包含了基本操作按钮,包括退出程序,关于信息, 选择IP,开始捕获和导出日志。窗体主要为显示报文信息的列表区和具 体字段区,分别用树视图显示。具体界面如图3-1所示。
图3-1
2.4.2. 获得主机IP
通过System的Net类函数,容易获得主机的所有IP。代码如下: private void GetHostIP() {
{
treeView2.Nodes.Clear(); TreeNode root = (TreeNode)curr.Nodes[0].Clone(); treeView2.Nodes.Add(root); treeView2.ExpandAll(); } } 结果如图3-4所示。
图3-4
2.4.5. 导出日志
2010年 6月 11 日
第一章 引言 1.1. 关于题目 1.1.1. 题目要求 1.1.2. 选题背景 1.2. 关于编译软件 1.3. 关于稳定性
第二章 程序设计 2. 主要功能设计 2.1. 程序流程
第三章 程序实现 3. 类设计声明
目录
3.1. RawSocket类 3.2. EventArgs类 3.3. Header结构 3.4. 主要功能的实现 3.4.1. 程序界面 3.4.2. 获得主机IP 3.4.3. 显示列表 3.4.4. 详细信息 3.4.5. 导出日志 第四章 程序测试 4. 程序测试 总结与体会 附录:
2.1. RawSocket类
public class RawSocket {
private bool error_occurred;//是否产生错误 public bool KeepRunning;//是否继续进行 private static int len_receive_buf;//得到的数据流的长度 byte[] receive_buf_bytes;//收到的字节 private Socket socket = null; //声明套接字 public void Run()//开始接收 public void CreateAndBindSocket(string IP)//建立并绑定套接字 public void Shutdown()//停止接收 private bool SetSocketOption()//设置套接字 private void Receive(byte[] buf, int len) //解析接收的数据包 };
(3) 设置停止标志,当程序接收到停止命令时即停止。
.1.2. 选题背景
IP数据包是网络协议学习过程中容易接触到的,选择这个题目一是 为了将自己的所学知识加以运用,二是希望通过探索实践去实现题 目,在实践和实际的项目中提高自己的编程能力。因此我选定了这 个题目。
.2. 关于编译软件
本程序使用C#语言,Microsoft Visual Studio 2005进行编译。 Visual Studio 是微软公司推出的开发环境,Visual Studio 可以 用来创建 Windows 平台下的 Windows 应用程序和网络应用程序, 也可以用来创建网络服务、智能设备应用程序和 Office 插件。
图3-3
2.4.4. 详细信息
点击列表项,该项对应数据包的详细信息会显示在窗体右侧树形显
示。
private
void
treeView1_NodeMouseClick(object
sender,
TreeNodeMouseClickEventArgs e)
{
TreeNode curr = e.Node;
if (curr.Level == 0)
2.2. EventArgs类
class squar {
private string ip_version;// 版本 private uint header_length;//首部长度 private string service_type;//服务类型 private uint total_packet_length;//总长度 private string identification;//标识 private string flags;//标志 private string fragment_offset;//片偏移量 private string time_to_live;//寿命 private string protocol;//协议 private string checksum;//校验和 private string destination_address;//目的IP地址 private string origination_address;//源IP地址 private uint message_length; //数据长度 };
这次的课程设计使我掌握了一定的网络编程知识,同时也掌握了 探索问题解决问题的方法。更好的理解课本的知识,为以后的进一步学 习和考试打下良好的基础。
附录:
程序主源自文库代码
//解析接收的数据包,形成PacketArrivedEventArgs时间数据类对象,并 引发PacketArrival事件
unsafe private void Receive(byte[] buf, int len) {
通过这次课程设计,我收获了很多。首先把所学知识加以利用和 巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。
在程序设计编写过程中,使用异步来处理数据包的接受和处理, 异步线程要添加数据项到主线程创建的界面,这就需要处理两个线程间 的数据交换。使用托管函数调用主线程的控件,添加数据项,实践证明 达到了预期的目的,积累了经验。
.3. 关于稳定性
经测试,本程序可以在windows操作系统中稳定运行,较为稳定。要 求至少安装.Net Framework 2.0。
第2章 程序设计
1. 主要功能设计
根据分析,这个程序要实现如下几个功能,初始化、捕获数据包、 显示、导出日志。其中捕获数据包是程序的核心部分,是后续操作 的基础。程序结构如图2-1所示。
string hostName = Dns.GetHostName(); IPHostEntry ipEntry = Dns.GetHostEntry(hostName); IPAddress[] addr = ipEntry.AddressList; foreach (IPAddress ip in addr) {
网络协议分析课程设计
设计题目:解析IP数据包
姓 名: 院 (系):计算机与通信工程学 院 专业班级:网络工程 学 号: 指导教师:
成 绩:
时间: 2011年6月13日至 2011年6月17日
郑州轻工业学院 课程设计任务书
题目
解析IP数据包
专业、班级 网络工程08-1 学号 姓名
主要内容:
程序在Windows窗口环境下捕获IP数据报,并
第1章 引言
.1. 关于题目 .1.1. 题目要求
(1) 捕获网络中的IP数据包,解析数据包的内容,显示结果,并将 结果写入日志文件。
(2) 显示的内容包括:捕获的IP包的版本、头长度、服务类型、数 据包总长度、数据包标识、分段标志、分段偏移值、生存时 间、上层协议类型、头校验和、源IP地址和目的IP地址等内 容。
sender,
RawSocket.PacketArrivedEventArgs args)
{ TreeNode rootNode = new TreeNode(); TreeNode ipNode = MakeIPTreeNode(args); rootNode.Nodes.Add(ipNode); rootNode.Text = args.OriginationAddress + " -> " +
FileStream fs = new FileStream(logName, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs); foreach (TreeNode tr1 in treeView1.Nodes) {