实验八协议分析器程序的设计和实现Word文档下载推荐.docx
- 文档编号:6108763
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:13
- 大小:74.37KB
实验八协议分析器程序的设计和实现Word文档下载推荐.docx
《实验八协议分析器程序的设计和实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验八协议分析器程序的设计和实现Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
1)解析Ethernet帧
2)解析ARP数据包
3)解析IP数据包
4)解析ICMP,TCP和UDP数据包
5.给出关键代码,并附注释。
typedefstruct
{
BYTEDesMacAddr[6];
//目的地址
BYTESrcMacAddr[6];
//源地址
WORDLengthOrType;
//数据长度或类型
}MAC_HEADER;
//MAC帧类型定义
constu_shortMAC_TYPE_IP=0x0800;
constu_shortMAC_TYPE_ARP=0x0806;
constu_shortMAC_TYPE_RARP=0x8035;
MAC_HEADER*pMacHdr=(MAC_HEADER*)pPkt;
//Mac目的地址
strItem.Format("
Destinationaddress:
%02X:
%02X:
%02X"
pMacHdr->
DesMacAddr[0],
DesMacAddr[1],
DesMacAddr[2],
DesMacAddr[3],
DesMacAddr[4],
DesMacAddr[5]);
//Mac源地址
Sourceaddress:
SrcMacAddr[0],
SrcMacAddr[1],
SrcMacAddr[2],
SrcMacAddr[3],
SrcMacAddr[4],
SrcMacAddr[5]);
//类型/长度字段
if(ntohs(pMacHdr->
LengthOrType)>
1500) //类型字段(EthernetV2.0)
//根据类型字段调用相应的上层协议处理函数
if(ntohs(pMacHdr->
LengthOrType)==MAC_TYPE_IP)//IP协议
{
strItem="
IP"
;
ParseIPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),
iLen-sizeof(MAC_HEADER));
}
elseif(ntohs(pMacHdr->
LengthOrType)==MAC_TYPE_ARP)//ARP协议
ARP"
ParseARPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),
LengthOrType)==MAC_TYPE_RARP)//RARP协议
RARP"
ParseRARPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),
iLen-sizeof(MAC_HEADER));
else//其他
UNKNOWN"
}
else//长度字段(IEEE802格式)
strItem.Format("
Length:
%dbytes"
ntohs(pMacHdr->
LengthOrType));
……/*解析IEEE802数据帧,省略*/
//ARP头部结构
typedefstruct
u_shorthardware_type;
//16位硬件类型
u_shortproto_type;
//16位协议类型
u_charhardware_addr_len;
//8位硬件地址长度
u_charproto_addr_len;
//8位协议地址长度
u_shortoperation_code;
//16位操作码
u_charsrc_mac_addr[6];
//源Ethernet网地址
u_charscr_ip_addr[4];
//源IP地址
u_chardest_mac_addr[6];
//目的Ethernet网地址
u_chardest_ip_addr[4];
//目的IP地址
}ARP_HEADER;
//ARP报文操作码类型,1为请求,2位应答
constu_shortARP_OP_REQUEST=1;
//ARP请求
constu_shortARP_OP_REPLY=2;
//ARP应答
ARP_HEADER*pARPHdr=(ARP_HEADER*)pPkt;
ntohs(pARPHdr->
hardware_type);
//硬件类型
proto_type);
//上层协议类型
pARPHdr->
hardware_addr_len;
//硬件地址长度
proto_addr_len;
//协议地址长度
//操作类型
if(ntohs(pARPHdr->
operation_code)==ARP_OP_REQUEST)
strItem="
(Request)"
elseif(ntohs(pARPHdr->
operation_code)==ARP_OP_REPLY)
(Reply)"
//源Mac地址
Sender'
shardwareaddress:
pARPHdr->
src_mac_addr[0],
src_mac_addr[1],
src_mac_addr[2],
src_mac_addr[3],
src_mac_addr[4],
src_mac_addr[5]);
//源IP地址
in_addripAddr;
memcpy(&
ipAddr,pARPHdr->
scr_ip_addr,sizeof(in_addr));
inet_ntoa(ipAddr);
//转化为点分十进制字符串
//目的Mac地址
Target'
dest_mac_addr[0],
dest_mac_addr[1],
dest_mac_addr[2],
dest_mac_addr[3],
dest_mac_addr[4],
dest_mac_addr[5]);
//目的IP地址
dest_ip_addr,sizeof(in_addr));
//填充字段长度
Framepadding:
iLen-sizeof(ARP_HEADER));
//IP头部结构
unsignedcharhdr_len:
4;
//4位头部长度
unsignedcharversion:
//4位版本号
unsignedchartos;
//8位服务类型
unsignedshorttotal_len;
//16位总长度
unsignedshortidentifier;
//16位标识符
unsignedshortfrag_and_flags;
//3位标志+13位片偏移
unsignedcharttl;
//8位生存时间
unsignedcharprotocol;
//8位上层协议号
unsignedshortchecksum;
//16位校验和
unsignedlongsource_ip;
//32位源IP地址
unsignedlongdest_ip;
//32位目的IP地址
}IP_HEADER;
IP_HEADER*pIPHdr=(IP_HEADER*)pPkt;
……/*解析IP头部各字段并显示输出*/
//根据不同上层协议调用相应解析函数
switch(pIPHdr->
protocol)
caseIPPROTO_TCP:
TCP"
ParseTCPPacket((BYTE*)pIPHdr+iIPHdrLen,iLen-iIPHdrLen);
break;
caseIPPROTO_UDP:
UDP"
ParseUDPPacket((BYTE*)pIPHdr+iIPHdrLen,iLen-iIPHdrLen);
caseIPPROTO_ICMP:
ICMP"
ParseICMPPacket((BYTE*)pIPHdr+iIPHdrLen,iLen-iIPHdrLen);
default:
OTHERS"
4)解析ICMP,TCP和UDP数据包
//ICMP基本头部
BYTEtype;
//8位类型
BYTEcode;
//8位代码
USHORTcksum;
}ICMP_BASE_HEADER;
//----------------------------------------------------
//ICMP回显头部(回显请求、回显应答)
ICMP_BASE_HEADERbase_hdr;
//基本头部
USHORTid;
//16位标识符
USHORTseq;
//16位序列号
}ICMP_ECHO_HEADER;
//ICMP差错报文头部(超时及目的不可达)
ULONGunused;
//32位未用,必须为0
}ICMP_ERROR_HEADER;
pICMPHdr->
type;
//类型
code;
//代码
ntohs(pICMPHdr->
cksum);
//校验和
//根据不同类型解析后续字段
switch(pICMPHdr->
type)
caseICMP_ECHO_REQUEST:
//回显请求报文
caseICMP_ECHO_REPLY:
//回显应答报文
ICMP_ECHO_HEADER*pICMPEchoHdr=(ICMP_ECHO_HEADER*)pPkt;
ntohs(pICMPEchoHdr->
id);
//标识符
seq);
//序列号
if(iLen>
sizeof(ICMP_ECHO_HEADER))//选项数据
{
for(inti=0;
i<
iLen-sizeof(ICMP_ECHO_HEADER);
i++)
……/*打印选项数据*/
}
break;
caseICMP_TIMEOUT:
//超时差错报文
caseICMP_HOST_UNREACHABLE:
//目的不可达差错报文
ICMP_ERROR_HEADER*pICMPErrHdr=(ICMP_ERROR_HEADER*)pPkt;
ntohl(pICMPErrHdr->
unused);
//保留字段
//解析产生差错的数据报IP首部(含选项字段)及其载荷的前8个字节
ParseIPPacket((BYTE*)pICMPErrHdr+sizeof(ICMP_ERROR_HEADER),
iLen-sizeof(ICMP_ERROR_HEADER));
5)解析HTTP数据包
/*HTTP消息的拷贝存放在pHttpPkt指向的缓冲区中
首先在HTTP消息中查找代表消息头结束的空行*/
char*pStopPos=strstr(pHttpPkt,"
\r\n\r\n"
);
//结束指针指向最后的空行
if(pStopPos!
=NULL)//存在空行
char*pBegPos=pHttpPkt;
//每行的首指针
char*pCurPos=pHttpPkt;
//每行的尾指针
intiLine=1;
while(pCurPos<
pStopPos)
//查找消息头中每行的结束符
pCurPos=strstr(pBegPos,"
\r\n"
if(pCurPos!
=NULL)
*pCurPos='
\0'
//将该行变为以NULL结尾的字符串
/*如果第一行含有版本字段前缀“HTTP/”则认为是一个正确的HTTP头*/
if(iLine++==1)
if(strstr(pBegPos,"
HTTP/"
)==NULL)
break;
strItem.Format(“%s”,pBegPos);
//输出该行信息
pCurPos+=2;
//跳过回车换行符指向下一行开始
pBegPos=pCurPos;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 协议 分析器 程序 设计 实现