WireShark网络抓包实验
- 格式:doc
- 大小:799.50 KB
- 文档页数:11
wireshark抓包实验报告Wireshark抓包实验报告1. 实验简介本次实验旨在通过使用Wireshark软件进行网络抓包,深入了解网络通信过程中的数据传输和协议交互。
通过分析抓包数据,我们可以了解网络流量的组成、协议的运作方式以及网络安全的相关问题。
2. 实验准备在进行实验之前,我们需要准备一台运行Wireshark软件的计算机,并连接到一个网络环境中。
Wireshark是一款开源的网络协议分析工具,可以在各种操作系统上运行。
安装并配置好Wireshark后,我们就可以开始进行抓包实验了。
3. 实验步骤3.1 启动Wireshark打开Wireshark软件,选择需要抓包的网络接口。
Wireshark会监听该接口上的所有网络流量,并将其显示在界面上。
3.2 开始抓包点击“开始”按钮,Wireshark开始抓取网络数据包。
此时,我们可以看到界面上实时显示的数据包信息,包括源地址、目标地址、协议类型等。
3.3 过滤抓包数据由于网络流量非常庞大,我们可以使用过滤器来筛选出我们感兴趣的数据包。
Wireshark提供了丰富的过滤器选项,可以根据协议、源地址、目标地址等条件进行过滤。
3.4 分析抓包数据选中某个数据包后,Wireshark会显示其详细信息,包括协议分层、数据字段等。
通过分析这些信息,我们可以了解数据包的结构和内容,进一步了解网络通信的细节。
4. 实验结果与讨论在实验过程中,我们抓取了一段时间内的网络流量,并进行了分析。
通过对抓包数据的观察和解读,我们得出了以下几点结果和讨论:4.1 协议分层在抓包数据中,我们可以清晰地看到各种协议的分层结构。
从物理层到应用层,每个协议都承担着不同的功能和责任。
通过分析协议分层,我们可以了解协议之间的关系,以及它们在网络通信中的作用。
4.2 数据传输过程通过分析抓包数据,我们可以追踪数据在网络中的传输过程。
我们可以看到数据包从源地址发送到目标地址的路径,了解中间经过的路由器和交换机等设备。
Wireshark抓包实验报告!10Wireshark是一款网络抓包工具,可以对网络通信进行实时分析和捕获数据包。
本实验使用Wireshark工具对HTTP协议进行抓包分析,对其协议报文格式、HTTP请求和响应分析等进行总结和说明。
一、实验环境和工具Wireshark版本:Wireshark 3.4.8操作系统:macOS Big Sur 11.2浏览器:Google Chrome 98.0.4758.102(64 位)二、实验内容本实验选择一个网站的首页进行抓包分析,抓取HTTP协议的请求和响应报文。
操作步骤如下:1. 打开浏览器,输入目标网站的URL,进入网站首页。
2. 打开Wireshark工具,选择需要抓包的网卡以及抓包过滤条件。
3. 在浏览器上刷新一次网页,等待网页加载完成。
4. 在Wireshark上停止抓包,对抓取到的数据进行分析。
三、实验结果1. HTTP协议报文格式HTTP协议报文由请求报文和响应报文两部分组成。
请求报文分为请求行、请求头和请求体三个部分,响应报文分为状态行、响应头和响应体三个部分。
具体格式如下:请求报文:请求行:方法URI HTTP/版本请求头:Header1:value1Header2:value2…请求体:Content-Type:typeContent-Length:lengthContent:data2. HTTP请求分析通过Wireshark抓取到的数据包,可以看到浏览器发送的HTTP请求报文。
请求报文的三个部分如下:请求体为空。
请求行包括请求方法、URI和HTTP版本号。
请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS等。
URI是请求的资源地址,如/表示根目录下的index.html文件。
HTTP 版本号有HTTP/1.0、HTTP/1.1等。
请求头包括Host、User-Agent、Accept、Accept-Encoding、Accept-Language等信息。
wireshark抓包实验报告总结一、实验目的本次实验的主要目的是学习Wireshark抓包工具的使用方法,掌握网络通信过程中数据包的组成和解析方式,以及了解常见网络协议的运行机制。
二、实验环境本次实验使用的操作系统为Windows 10,使用Wireshark版本为3.4.6。
三、实验步骤1. 安装Wireshark软件并打开。
2. 选择需要抓包的网络接口,并开始抓包。
3. 进行相应的网络操作,例如访问网站、发送邮件等。
4. 停止抓包,并对捕获到的数据包进行分析和解析。
四、实验结果1. 抓取HTTP请求和响应数据包通过Wireshark抓取HTTP请求和响应数据包,可以轻松地了解HTTP协议在通信过程中所传输的信息。
例如,在访问一个网站时,可以看到浏览器向服务器发送GET请求,并获取到服务器返回的HTML 页面等信息。
同时还可以看到HTTP头部中所携带的信息,例如User-Agent、Cookie等。
2. 抓取TCP连接数据包通过Wireshark抓取TCP连接数据包,可以了解TCP协议在建立连接、传输数据和关闭连接时所涉及到的所有步骤。
例如,在进行FTP 文件传输时,可以看到TCP三次握手建立连接,以及文件传输过程中TCP的流量控制和拥塞控制等。
3. 抓取UDP数据包通过Wireshark抓取UDP数据包,可以了解UDP协议在通信过程中所涉及到的所有信息。
例如,在进行DNS域名解析时,可以看到DNS服务器返回的IP地址等信息。
五、实验总结通过本次实验,我学会了使用Wireshark抓包工具进行网络数据包分析的方法,并了解了常见网络协议的运行机制。
同时也发现,在网络通信过程中,数据包所携带的信息非常丰富,能够提供很多有用的参考和指导。
因此,在实际工作中,我们应该灵活运用Wireshark等工具进行网络数据包分析,并结合具体业务场景进行深入研究和分析。
wireshark抓包实验报告Wireshark抓包实验报告引言:网络是现代社会中不可或缺的一部分,人们在日常生活中几乎无时无刻不在使用网络。
然而,网络的复杂性使得网络问题的排查变得困难。
Wireshark作为一款强大的网络抓包工具,可以帮助我们深入分析网络数据包,从而更好地理解和解决网络问题。
本文将介绍Wireshark的基本原理和使用方法,并通过实际抓包实验来验证其功能和效果。
一、Wireshark的基本原理Wireshark是一款开源的网络协议分析工具,可以运行在多个操作系统上。
它通过捕获网络接口上的数据包,并将其解析成可读的形式,以便我们进行深入分析。
Wireshark支持多种协议,包括以太网、无线网络、TCP/IP等,使得我们能够全面了解网络通信的细节。
二、Wireshark的使用方法1. 下载和安装Wireshark可以从其官方网站上免费下载,根据自己的操作系统选择合适的版本进行安装。
安装完成后,打开Wireshark并选择要抓包的网络接口。
2. 抓包设置在开始抓包之前,我们需要进行一些设置以确保我们能够捕获到想要分析的数据包。
首先,我们可以设置抓包过滤器来过滤出特定的数据包,以减少不必要的干扰。
其次,我们可以选择是否启用深度分析,以获取更详细的协议信息。
3. 开始抓包一旦设置完成,我们可以点击“开始”按钮开始抓包。
Wireshark将开始捕获网络接口上的数据包,并将其显示在主界面上。
我们可以看到每个数据包的详细信息,包括源IP地址、目标IP地址、协议类型等。
4. 数据包分析Wireshark提供了丰富的功能和工具,使得我们可以对抓包的数据包进行深入分析。
我们可以通过点击每个数据包来查看其详细信息,并根据需要进行过滤、排序和搜索。
此外,Wireshark还提供了统计功能,帮助我们了解网络流量的情况。
三、实验验证为了验证Wireshark的功能和效果,我们进行了一次抓包实验。
实验中,我们使用Wireshark抓取了一段时间内的网络数据包,并进行了分析。
网络抓包分析实验报告一:实验目的:1. 学习使用网络数据抓包软件Ethereal,对互连网进行数据抓包,巩固对所学知识的理解二:实验内容:1:分析IP,ICMP的报文格式。
三:实验工具Wireshark抓包软件四:实验步骤1、安装Wireshark,简单描述安装步骤。
2、打开wireshark,选择接口选项列表。
或单击“Capture”,配置“option”选项。
3、设置完成后,点击“start”开始抓包,显示结果。
4、选择某一行抓包结果,双击查看此数据包具体结构5、抓ICMP时在开始->运行cmd->tracert 五:分析1:IP报文分析报文格式:截图:分析:由图可知:IP报文版本号是IPV4,首部长度:20 bytes,数据包总长度:58,标示符:0x7335,标志:0x00,比特偏移:0,寿命:112,上层协议:UDP,首部校验和:0x071d,并且是正确的。
源IP地址:61.142.208.196目的IP地址:192.168.1.102二:ICMP报文分析截图如下:ICMP格式有抓包显示截图可知:类型:8 (回显请求)代码/编码:0校验和:0xf2ff(正确的校验和)标示符:0x0300;序列号:512(0x0200)通过这次试验,培养了自己动手的能力,另外,通过对wireshark抓包软件的使用,用其来抓取数据包,对ip, icmp报文的格式有了进一步的了解,通过对报文格式的分析,并且把课本上多学的理论知识与实践结合起来,对以前的知识得到深化和巩固,为以后学习新的知识打下基础,也提高了学习的兴趣,收获很大。
Wireshark抓包⼯具计算机⽹络实验实验⼀ Wireshark 使⽤⼀、实验⽬的1、熟悉并掌握Wireshark 的基本使⽤;2、了解⽹络协议实体间进⾏交互以及报⽂交换的情况。
⼆、实验环境与因特⽹连接的计算机,操作系统为Windows ,安装有Wireshark 、IE 等软件。
三、预备知识要深⼊理解⽹络协议,需要观察它们的⼯作过程并使⽤它们,即观察两个协议实体之间交换的报⽂序列,探究协议操作的细节,使协议实体执⾏某些动作,观察这些动作及其影响。
这种观察可以在仿真环境下或在因特⽹这样的真实⽹络环境中完成。
Wireshark 是⼀种可以运⾏在Windows, UNIX, Linux 等操作系统上的分组嗅探器,是⼀个开源免费软件,可以从/doc/d2530113af45b307e871976b.html 下载。
运⾏Wireshark 程序时,其图形⽤户界⾯如图2所⽰。
最初,各窗⼝中并⽆数据显⽰。
Wireshark 的界⾯主要有五个组成部分:图1命令和菜单协议筛选框捕获分组列表选定分组⾸部明细分组内容左:⼗六进制右:ASCII 码●命令菜单(command menus):命令菜单位于窗⼝的最顶部,是标准的下拉式菜单。
●协议筛选框(display filter specification):在该处填写某种协议的名称,Wireshark 据此对分组列表窗⼝中的分组进⾏过滤,只显⽰你需要的分组。
●捕获分组列表(listing of captured packets):按⾏显⽰已被捕获的分组内容,其中包括:分组序号、捕获时间、源地址和⽬的地址、协议类型、协议信息说明。
单击某⼀列的列名,可以使分组列表按指定列排序。
其中,协议类型是发送或接收分组的最⾼层协议的类型。
●分组⾸部明细(details of selected packet header):显⽰捕获分组列表窗⼝中被选中分组的⾸部详细信息。
包括该分组的各个层次的⾸部信息,需要查看哪层信息,双击对应层次或单击该层最前⾯的“+”即可。
本科实验报告实验名称:利用EtherPeek工具进行的网络抓包实验学员:学号:专业:所属学院:国防科学技术大学训练部制【实验名称】利用Wireshark工具进行的抓包实验【实验目的】通过Wireshark软件捕获并观察ARP协议、ICMP协议、FTP协议、HTTP协议以及TCP协议的工作原理,包括协议序列和报文内容【实验内容】实验环境描述:网络环境:因特网操作系统:Windows 7软件:Wiresharkv1.12.4实验步骤:1.Ping命令(ARP, ICMP分析)2.在实验主机使用FTP应用(FTP分析)3.在实验主机使用web应用(HTTP分析)【实验过程】1.ping命令(ICMP、ARP分析)实验主机的IP地址为:实验主机的MAC地址为:9c:4e:36:cf:db:e4在实验主机的命令框内输入命令:pingWireshark抓获的数据包如下:观察可得,抓获的报文里协议类型有ICMP与ARP。
(前12条是输入ping命令后抓取的)(1)ICMP分析:首先明确一下ICMP的相关知识:ICMP是(Internet Control Message Protocol)Internet控制报文协议。
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
各种ICMP报文的前32bits都是三个长度固定的字段:type类型字段(8位)、code代码字段(8位)、checksum校验和字段(16位) 8bits类型和8bits代码字段:一起决定了ICMP报文的类型。
常见的有:类型0、代码0:回应应答。
类型3、代码0:网络不可达类型3、代码1:主机不可达类型5、代码1:为主机重定向数据包类型8、代码0:回应类型11、代码0:传输中超出TTL(常说的超时)16bits校验和字段:包括数据在内的整个ICMP数据包的校验和,其计算方法和IP头部校验和的计算方法是一样的。
wireshark实验报告Wireshark实验报告引言:Wireshark是一款网络封包分析软件,被广泛应用于网络安全、网络管理和网络故障排除等领域。
本篇实验报告将介绍Wireshark的基本原理、实验环境和实验过程,并通过实验结果分析其应用价值。
一、Wireshark的基本原理Wireshark基于网络抓包技术,能够捕获网络通信过程中的数据包,并对其进行解析和分析。
它支持多种网络协议,包括以太网、无线局域网、传输控制协议(TCP)、用户数据报协议(UDP)等。
Wireshark通过监听网络接口,将捕获到的数据包以图形化界面的形式呈现给用户,方便用户进行深入分析。
二、实验环境本次实验使用的环境是一台运行Windows操作系统的个人电脑,安装了最新版本的Wireshark软件。
实验中使用了一个虚拟网络环境,包括两台虚拟机,分别运行着Windows和Linux操作系统。
三、实验过程1. 安装Wireshark:首先,将Wireshark软件下载到本地,并按照安装向导进行安装。
安装完成后,打开Wireshark程序。
2. 设置捕获接口:在Wireshark界面上方的工具栏中,选择“捕获选项”按钮。
在捕获选项对话框中,选择需要捕获的网络接口,点击“开始”按钮开始抓包。
3. 进行通信测试:在虚拟机中进行网络通信测试,例如在Windows虚拟机中打开浏览器,访问一个网站。
同时,在Linux虚拟机中执行ping命令,向外部主机发送数据包。
4. 分析捕获的数据包:在Wireshark界面中,可以看到捕获到的数据包以列表的形式展示出来。
通过点击某个数据包,可以查看其详细信息,包括源IP地址、目标IP地址、协议类型等。
5. 过滤和统计功能:Wireshark还提供了强大的过滤和统计功能,可以根据需要筛选和分析数据包。
例如,可以根据源IP地址过滤出特定的数据包,或者统计某个协议的使用情况。
四、实验结果分析通过对捕获的数据包进行分析,我们可以得到一些有价值的结果。
第一次实验:利用Wireshark软件进行数据包抓取1.3.2 抓取一次完整的网络通信过程的数据包实验一,实验目的:通过本次实验,学生能掌握使用Wireshark抓取ping命令的完整通信过程的数据包的技能,熟悉Wireshark软件的包过滤设置和数据显示功能的使用。
二,实验环境:操作系统为Windows 7,抓包工具为Wireshark.三,实验原理:ping是用来测试网络连通性的命令,一旦发出ping命令,主机会发出连续的测试数据包到网络中,在通常的情况下,主机会收到回应数据包,ping采用的是ICMP协议。
四,验步骤:1.确定目标地址:选择作为目标地址。
2.配置过滤器:针对协议进行过滤设置,ping使用的是ICMP协议,抓包前使用捕捉过滤器,过滤设置为icmp,如图 1- 1图 1-13.启动抓包:点击【start】开始抓包,在命令提示符下键入ping , 如图 1-2图 1-2停止抓包后,截取的数据如图 1-3图 1-34,分析数据包:选取一个数据包进行分析,如图1- 4图1-4每一个包都是通过数据链路层DLC协议,IP协议和ICMP协议共三层协议的封装。
DLC协议的目的和源地址是MAC地址,IP协议的目的和源地址是IP地址,这层主要负责将上层收到的信息发送出去,而ICMP协议主要是Type和Code来识别,“Type:8,Code:0”表示报文类型为诊断报文的请求测试包,“Type:0,Code:0”表示报文类型为诊断报文类型请正常的包。
ICMP提供多种类型的消息为源端节点提供网络额故障信息反馈,报文类型可归纳如下:(1)诊断报文(类型:8,代码0;类型:0代码:0);(2)目的不可达报文(类型:3,代码0-15);(3)重定向报文(类型:5,代码:0--4);(4)超时报文(类型:11,代码:0--1);(5)信息报文(类型:12--18)。
1.4.1,TCP协议的分析实验一,实验目的:通过本次实验,掌握使用Wireshark抓取TCP协议的数据包的技能,能够在深入分析“TCP的三次握手”,TCP的四次挥手协议在网络数据流的基础上,进一步提高理论联系实践的能力。
计算机网络管理姓名:姚建国班级:网络工程学号:080510101一.实验目的學會使用snmpb分析mib tree,使用wireshark抓包以及分析該包。
根據snmp 協定,分析抓包軟體抓出的結果。
二.实验内容1. 使用Snmp1)安装snmpb2)实验步骤3)点击mib tree分析各结点2.使用wireshark抓包1)安装WireShark,中间会提示安装WinPcap,一切都是默认。
2)实验前先关掉联网的软件,防止产生一些不必要的流量,以利于实验分析。
3)打开WireShark,选择"Capture>>Interfaces",选择自己的网卡。
选择"Start"开始监控流量。
UDP协议分析,选择一个包单击,结果如下抓包过程中发现TCP组播、HTTP组播等。
A.组播分析.Ethernet II帧,Src: RealtekS_46:f2:4f (00:e0:4c:46:f2:4f), Dst:IPv4mcast_66:74:6e (01:00:5e:66:74:6e)。
源地址RealtekS,目的地址IPv4mcast_66:74:6e。
Internet Protocol(IP数据包),User Datagram Protocol(UDP数据包), Src Port: irisa (11000), Dst Port: irisa (11000)。
B.ARP广播。
Ethernet II帧,Src: FujianSt_f8:ec:eb (00:d0:f8:f8:ec:eb)[锐捷网络的交换机,这里显示"福建实达网络"], Dst: Broadcast (ff:ff:ff:ff:ff:ff)Address Resolution Protocol (request)(ARP数据包)Sender MAC address: FujianSt_f8:ec:eb (00:d0:f8:f8:ec:eb)Sender IP address: 10.1.10.254 (10.1.10.254)Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)Target IP address: 10.1.10.135 (10.1.10.135)ARP是一个三层的协议,直接跑在Frame之上4)再次启动WireShark,打开网页[url][/url],抓包。
C.HTTP数据包分析。
Ethernet II Frame,Src: Elitegro_59:a7:88 (00:16:ec:59:a7:88)【VIA的网卡,这里显示Elitegro】, Dst: FujianSt_f8:ec:eb (00:d0:f8:f8:ec:eb)Internet Protocol,Src: 10.1.10.157 (10.1.10.157), Dst: 203.208.33.100 (203.208.33.100)【的IP地址】Transmission Control Protocol,Src Port: hppronetman (3908), Dst Port: http (80), Seq: 0, Len: 0从抓的包中可以看到TCP的连接建立过程(Three-way Handshake).[syn][syn,ack][ack]3.报文构造代码void BindSequenceOf_TLV(unsigned char *return_tlv_bind,int &return_tlv_bind_len,message MSG)//name value name value{ for(int i=0;i<6;i++)//{ //get return_tlv_bindunsigned char return_tlv[50];int return_tlv_len=0;unsigned char tlv_name[10]; int tlv_name_len=0;unsigned char tlv_value[10]; int tlv_value_len=0;//forif(MSG.pdu.variable_bindings[i].name.length()==0) continue;else{ Objectidentifier_TLV(tlv_name,tlv_name_len,MSG.pdu.variable_bindings[i].name);Sequence_TLV(return_tlv,return_tlv_len,tlv_name,tlv_name_len);if(MSG.pdu.pdutype==2)//SET_REQUEST{ Null_TLV(tlv_value,tlv_value_len,25);} else{ Null_TLV(tlv_value,tlv_value_len,-1);}//((*(MSG.pdu.variable_bindings+i)).name);Sequence_TLV(return_tlv,return_tlv_len,tlv_value,tlv_value_len);SequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,return_tlv,return_tlv_len);} } }void PduSequence_TLV(unsigned char *return_tlv_Pdu,int &return_tlv_Pdu_len,message MSG)//pdutype id 0 0 bind //,TLV &return_tlv_bind{ switch (MSG.pdu.pdutype){ case 0: return_tlv_Pdu[0]=160;break;//A0H "10100000" requestcase 1: return_tlv_Pdu[0]=161;break;//A1H "10100001" next_requestcase 2: return_tlv_Pdu[0]=163;break;//A3H "10100011" set_requestcase 3: return_tlv_Pdu[0]=162;break;//A2H "10100010" responsecase 4: return_tlv_Pdu[0]=164;break;//A4H "10100100"default: break;}unsigned char TLV_request_id[5];int TLV_request_id_len=0;unsigned char TLV_error_status[5];int TLV_error_status_len=0;unsigned char TLV_error_index[5];int TLV_error_index_len=0;Integer_TLV(TLV_request_id,TLV_request_id_len,MSG.pdu.request_id);Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_request_id,TLV_request_id_len); Integer_TLV(TLV_error_status,TLV_error_status_len,MSG.pdu.error_status);//error_status;Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_status,TLV_error_status_len); Integer_TLV(TLV_error_index,TLV_error_index_len,MSG.pdu.error_index);//error_index;Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_index,TLV_error_index_len);unsigned char return_tlv_bind[50];int return_tlv_bind_len=0;//BindSequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,MSG);//varBind*variable_bindings;Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,return_tlv_bind,return_tlv_bind_len);}void MessSequence_TLV(unsigned char *return_tlv_message,int&return_tlv_message_len,message MSG)//version community snmppdu ,TLV &return_tlv_Pdu { unsigned char TLV_version[10];int TLV_version_len=0;unsigned char TLV_community[10];int TLV_community_len=0;Integer_TLV(TLV_version,TLV_version_len,MSG.version);//versionSequence_TLV(return_tlv_message,return_tlv_message_len,TLV_version,TLV_version_len); OctetString_TLV(TLV_community,TLV_community_len,munity);//communitySequence_TLV(return_tlv_message,return_tlv_message_len,TLV_community,TLV_community_len); unsigned char return_tlv_Pdu[150];int return_tlv_Pdu_len=0;PduSequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,MSG);//PDUs pdu; Sequence_TLV(return_tlv_message,return_tlv_message_len,return_tlv_Pdu,return_tlv_Pdu_len);}void createmessage(char *Buffer,char *pdutype,int &leng_buffer){ using std::cout;using std::cin;using std::endl;unsigned char return_tlv_message[300];int return_tlv_message_len=0;message MSG;int i=0;MSG.pdu.pdutype=atoi(pdutype);cout<<"choose input the community"<<endl;cin>>munity;cout<<"choose input the name ,maxsize: 6"<<endl;MSG.pdu.variable_bindings=new struct varBind[6];string input;//for inputcin>>input;while(input!="send"){ MSG.pdu.variable_bindings[i++].name=input;cin>>input;} MSG.version=0;//munity="public";MSG.pdu.error_index=0;MSG.pdu.error_status=0;MSG.pdu.request_id=abs(rand());//90 (32767)MessSequence_TLV(return_tlv_message,return_tlv_message_len,MSG);leng_buffer=return_tlv_message_len;for(int l=0;l<return_tlv_message_len;l++){ cout<<(int)return_tlv_message[l]<<" ";Buffer[l]=return_tlv_message[l];//(int)//cout<<(int)Buffer[l]<<" ";} cout<<endl; cout<<endl; }解析和解码代码如下:void strcpyTLV( char temp_INTEGER[], char get_pdu[],int k,int len)//字符串拷贝,拷贝value 部分{ int begin=k;for(int p=0;p<len;p++){ temp_INTEGER[p]=get_pdu[begin++];}temp_INTEGER[len]=0;}void prinout( char temp_INTEGER[],bool change_line)//输出整数value部分{ if(change_line){ std::cout<<(int)temp_INTEGER[0]<<endl;} else std::cout<<(int)temp_INTEGER[0]; }void printout_OBJE( char temp_name[],int len)//输出标识符{ std::cout<<"1.3.";int i=1; while(i<len){ std::cout<<(int)temp_name[i++]<<".";} std::cout<<endl; }void Dcode_version( char temp_INTEGER[],int len)//version解析{ std::cout<<"version: "<<INTEGER<<" "<<len<<" ";prinout(temp_INTEGER,true); }void Dcode_OCTETSTRING( char temp_OCTETSTRING[],int len)//community解析{ std::cout<<"community: "<<OCTETSTRING <<" "<<len<<" "<<temp_OCTETSTRING<<endl; }void Dcode_PDUTYPE(int Tlv_T)//pdutype解析{ std::cout<<"pdutype: "<<Tlv_T <<endl; }void Dcode_resid( char temp_INTEGER[],int len)//requestid解析{ for(int g=0;g<len;g++){ temp_INTEGER[g]<<=(len-1-g)*8; }int sum=temp_INTEGER[0];for(int h=1;h<len;h++){ sum|=temp_INTEGER[h];}std::cout<<"requestid: "<<INTEGER<<" "<<len<<" "<<sum<<endl; }void Dcode_errorstatus(char temp_INTEGER[],int len)//errorstatus解析{ std::cout<<"errorstatus: "<<INTEGER<<" "<<len<<" ";prinout(temp_INTEGER,false);switch (temp_INTEGER[0]){ case 0:std::cout<<" NoError"<<endl;break; case 1:std::cout<<" TooBig"<<endl;break; case 2:std::cout<<" NoSuchname"<<endl;break;case 3:std::cout<<" BadValue"<<endl;break;case 4:std::cout<<" ReadOnly"<<endl;break; case 5:std::cout<<" genErr"<<endl;break;default:break; }}void Dcode_errorindex( char temp_INTEGER[],int len)//errorindex解析{ std::cout<<"errorindex: "<<INTEGER<<" "<<len<<" ";prinout(temp_INTEGER,false);if(temp_INTEGER[0]!=0){ std::cout<<" The"<<(int)temp_INTEGER[0]<<"name is wrong"<<endl;} else std::cout<<endl;}void Dcode_name( char temp_name[],int total_name,int len)//标识符解析{ std::cout<<"name: "<<OBER<<" "<<len<<" ";printout_OBJE(temp_name,len); }void Dcode_value_INTEGER( char temp_INTEGER[],int total_name,int len)//value解析{ std::cout<<"value: "<<INTEGER<<" "<<len<<" ";prinout(temp_INTEGER,true); }void Dcode_Null(int len)//Null类型解析{ std::cout<<"value: "<<Null<<" "<<len<<" "<<endl; }void Dcode_IpAddress( char temp_ipaddress[],int len)//ipaddress解析{ std::cout<<"Ipaddress: "<<IpAddress<<" "<<len;for(int mm=0;mm<len;mm++){ std::cout<<temp_ipaddress[mm]<<"."; } }void Decode_pdu(char get_pdu[])//主函数{ std::cout<<"parasing "<<"type"<<" "<<"len"<<" "<<"value"<<" "<<endl;int total_length=get_pdu[1];//长度int total_INTEGER=0; int total_name=0;int len=0;int len1=0;int len2=0;int len3=0;int len4=0;//定义各length值int len7=0;int len6=0;int len5=0;int len8=0;int i=2; while(i<total_length+2){ int Tlv_T=0;Tlv_T=(int)get_pdu[i];switch (Tlv_T){ case INTEGER :// 2++total_INTEGER;if(total_INTEGER==1)//vertion{len=(int)get_pdu[i+1];char temp_INTEGER[10];//strcpyTLV(temp_INTEGER,get_pdu,i+2,len);Dcode_version(temp_INTEGER,len);i=i+len+1;//i=i+len+1+1;} else if(total_INTEGER==2)//requestId{ len1=(int)get_pdu[i+1];char temp_INTEGER[100];//strcpyTLV(temp_INTEGER,get_pdu,i+2,len1);Dcode_resid(temp_INTEGER,len1); i=i+len1+1;} else if(total_INTEGER==3)//errorstatus{ len2=(int)get_pdu[i+1];char temp_INTEGER[5];//strcpyTLV(temp_INTEGER,get_pdu,i+2,len2);Dcode_errorstatus(temp_INTEGER,len2);i=i+len2+1; } elseif(total_INTEGER==4)//errorIndex{ len3=(int)get_pdu[i+1];char temp_INTEGER[5];//strcpyTLV(temp_INTEGER,get_pdu,i+2,len3);Dcode_errorindex(temp_INTEGER,len3);i=i+len3+1; } else //其他{ len4=(int)get_pdu[i+1];char temp_INTEGER[100];//strcpyTLV(temp_INTEGER,get_pdu,i+2,len4);Dcode_value_INTEGER(temp_INTEGER,total_name,len4);i=i+len4+1;// }break;case OCTETSTRING:// 4 字符len5=(int)get_pdu[i+1];char temp_OCTETSTRING[50];//strcpyTLV(temp_OCTETSTRING,get_pdu,i+2,len5);Dcode_OCTETSTRING(temp_OCTETSTRING,len5);i=i+len5+1;break;case GetResponse://pdutype//int len=get_pdu[i+1];Dcode_PDUTYPE(Tlv_T); i=i+2-1;break; case Trap://int len=get_pdu[i+1];Dcode_PDUTYPE(Tlv_T);i=i+2-1;break;case SEQ://seq 型if(total_name==0){ i=i+2-1;} else{ i=i+2-1;} ++total_name;break;case OBER://标识符len6=(int)get_pdu[i+1]; char temp_name[100];// strcpyTLV(temp_name,get_pdu,i+2,len6);Dcode_name(temp_name,total_name,len6); i=i+len6+1;break;case Null://空类型len7=(int)get_pdu[i+1]; temp_namek[10];//[len];//strcpyTLV(temp_namek,get_pdu,i+2,len7); //Dcode_Null(temp_namek,total_name,len7); Dcode_Null(len7);i=i+1;break;case IpAddress://ip地址len8=(int)get_pdu[i+1]; char temp_ipaddress[50];//strcpyTLV(temp_ipaddress,get_pdu,i+2,len8);Dcode_IpAddress(temp_ipaddress,len8);i=i+len8+1;break; default: break; } i++;}}程序运行结果如下图:我们实现了可以一次输入多个变量名,然后返回多个value的值。