📄 icmp.lst
字号:
C51 COMPILER V7.06 ICMP 05/27/2008 11:02:07 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ICMP
OBJECT MODULE PLACED IN .\RUN\icmp.obj
COMPILER INVOKED BY: D:\Keil7_06\C51\BIN\C51.EXE icmp.c OBJECT(.\RUN\icmp.obj)
stmt level source
1 /*********************************************************************
2 * Copright(c) 2004,张会福 湖南科技大学计算机学院
3 * All rights reserved.
4 *
5 *文件名称: icmp.c
6 *文件标识:
7 *摘 要: 测试主机的可达性,其中主要的操作是ping
8 *
9 *当前版本: V1.0
10 *完成日期: 2004.4.10
11 *
12 *
13 *********************************************************************/
14 #define ICMP_GLOBALS
15 #include "net_cfg.h"
16
17 /**********************************************************************
18 **函数原型: void Ping_Request( )
19 **入口参数: 无
20 **出口参数: 无
21 **返 回 值: 无
22 **说 明: 发送PING请求报文,测试对方主机的可达性
23 ************************************************************************/
24 void Ping_Request()
25 {
26 1 TxdNetBuff.EtherFrame.DestMacId[0]=Ping_MAC.words[0]; //填充以太网协议目的物理地址字段
27 1 TxdNetBuff.EtherFrame.DestMacId[1]=Ping_MAC.words[1];
28 1 TxdNetBuff.EtherFrame.DestMacId[2]=Ping_MAC.words[2];
29 1 TxdNetBuff.EtherFrame.NextProtocal=0x0800; //以太网协议的下层协议为IP协议
30 1 TxdNetBuff.IpFrame.VerandIphLen=0x45; //IP版本和首部长度各占VerandIphLen字段的4位,版
-本4,占用高4位
31 1 //首部长度5*4=20,单位字节
32 1 TxdNetBuff.IpFrame.ServerType=0x00; //服务类型,默认为0
33 1 TxdNetBuff.IpFrame.TotalLen=60; //IP数据报总长度40字节,其中由总长度
34 1 //减去首部长度即可得数据报长度
35 1 TxdNetBuff.IpFrame.ttl=0x80; //IP生存时间
36 1 TxdNetBuff.IpFrame.FrameIndex=FrameIndex; //帧序号
37 1 FrameIndex++; //
38 1 TxdNetBuff.IpFrame.Segment=0x0000; //标志及段偏移都为0
39 1 TxdNetBuff.IpFrame.NextProtocal=0x0001; //IP的下层协议为ICMP协议:TCP
40 1 TxdNetBuff.IpFrame.Crc=0;
41 1 TxdNetBuff.IpFrame.DestId[0]=Ping_Ip_Address.words[0]; //填充目的IP地址
42 1 TxdNetBuff.IpFrame.DestId[1]=Ping_Ip_Address.words[1];
43 1 TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0]; //填充源IP地址
44 1 TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
45 1 TxdNetBuff.IpFrame.Crc=CreateIpHeadCrc(); //产生IP数据报首部检验和,CreateIpHeadCrc()在gl
-obal.c中定义
46 1 TxdNetBuff.IcmpFrame.type=0x08; //表示该ICMP数据帧为PING请求
47 1 TxdNetBuff.IcmpFrame.Crc=0;
48 1 TxdNetBuff.IcmpFrame.id=0x0300; //标识符
49 1 TxdNetBuff.IcmpFrame.seq=FrameIndex; //ICMP报文序号
50 1 TxdNetBuff.IcmpFrame.Crc=CreateIcmpCrc(); //产生ICMP报文的校验和,CreatIcmpCrc()在global.
-c中定义
51 1 Send_Packet(&TxdNetBuff,74); //发送数据包
52 1 }
C51 COMPILER V7.06 ICMP 05/27/2008 11:02:07 PAGE 2
53 //==========================================================
54 /**********************************************************************
55 **函数原型: void Ping_Answer( )
56 **入口参数: 无
57 **入口参数: 无
58 **返 回 值: 无
59 **说 明: PING应答,与PING请求一起用来测试一个主机地可达性.PING的回答
60 **********: 是将PING请求报文的源物理地址和目的物理地址互换,源IP地址和
61 **********: 目的IP地址互换,将ICMP操作类型字段换为回答,并且将PING请求
62 **********: 报文中的选项数据(32字节)原封不动的发回.
63 ************************************************************************/
64 void Ping_Answer()
65 {
66 1 uchar i;
67 1 if(RxdNetBuff.IcmpFrame.type==0x08)//表示是ping请求
68 1 {
69 2 for (i=16;i<RxdNetBuff.EtherFrame.length;i++)
70 2 //从以太网协议开始复制数据到发送缓冲区
71 2 /* 发送以太网数据帧格式如下
72 2 * | 目的物理地址 | 源物理地址 | 以太网协议 | 数 据 报 |
73 2 * 6字节 6字节 2字节 46~1500字节
74 2 *
75 2 * | RTL8019 首部| 目的物理地址 | 源物理地址 | 以太网协议 | 数 据 报 |
76 2 * 4字节 6字节 6字节 2字节 46~1500字节
77 2 * |------->
78 2 * |从此处开始复制接收到的数据报
79 2 *因此在利用接收的数据拼装数据报时,一定要注意RTL8019自动地在接收数据报中添加
80 2 *了4字节的首部数据,在global.c文件的以太网驱动底层数据接收程序中也有详细说明.
81 2 */
82 2 {
83 3 TxdNetBuff.bytes.bytebuf[i]=RxdNetBuff.bytes.bytebuf[i];//将数据复制到发送缓冲区
84 3 }
85 2 //复制接收数据报的源物理地址到发送数据报的目的物理地址字段中
86 2 TxdNetBuff.EtherFrame.DestMacId[0]=RxdNetBuff.EtherFrame.SourceMacId[0];
87 2 TxdNetBuff.EtherFrame.DestMacId[1]=RxdNetBuff.EtherFrame.SourceMacId[1];
88 2 TxdNetBuff.EtherFrame.DestMacId[2]=RxdNetBuff.EtherFrame.SourceMacId[2];
89 2 TxdNetBuff.IpFrame.ttl=TxdNetBuff.IpFrame.ttl-1; //IP数据包寿命减1
90 2 TxdNetBuff.IpFrame.Crc=0;
91 2 TxdNetBuff.IpFrame.DestId[0]=RxdNetBuff.IpFrame.SourceIp[0];//复制源IP地址到目的IP地址字段中
92 2 TxdNetBuff.IpFrame.DestId[1]=RxdNetBuff.IpFrame.SourceIp[1];
93 2 TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0]; //填充源IP地址
94 2 TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
95 2 TxdNetBuff.IpFrame.Crc=CreateIpHeadCrc(); //创建IP头校验和
96 2 TxdNetBuff.IcmpFrame.type=0x00; //操作类型:ICMP应答
97 2 TxdNetBuff.IcmpFrame.Crc=0;
98 2 for(i=21;i<41;i++) //将接收缓冲区40字节的ICMP数据复制到发送缓冲区中
99 2 {
100 3 TxdNetBuff.words.wordbuf[i]=RxdNetBuff.words.wordbuf[i];
101 3 }
102 2 TxdNetBuff.IcmpFrame.Crc=CreateIcmpCrc();
103 2 Send_Packet(&TxdNetBuff,RxdNetBuff.EtherFrame.length);
104 2 }
105 1 }
106 //==========================================================
107 /**********************************************************************
108 **函数原型: void Ping_Echo( )
109 **入口参数: 无
110 **出口参数: 无
111 **返 回 值: 无
112 **说 明: 接收到PING应答数据后,在本地机通过串口回显信息
113 ************************************************************************/
114 void Ping_Echo()
C51 COMPILER V7.06 ICMP 05/27/2008 11:02:07 PAGE 3
115 {
116 1 union Ip_Address_Type ip;
117 1
118 1 ip.words[0] = RxdNetBuff.IpFrame.SourceIp[0];
119 1 ip.words[1] = RxdNetBuff.IpFrame.SourceIp[1];
120 1 Printf_String(" \r\nReply From IP=");
121 1 Printf_IPStr(ip);
122 1 Printf_String(" Bytes=32 ");
123 1 Printf_String("TTL=");
124 1 Printf_Hex(RxdNetBuff.IpFrame.ttl);
125 1 }
126 //===========================================================
127 /**********************************************************************
128 **函数原型: void Process_Ping( )
129 **入口参数: 无
130 **出口参数: 无
131 **返 回 值: 无
132 **说 明: 对PING数据包进行处理
133 ************************************************************************/
134 void Process_Ping()
135 {
136 1 if(Ping_Count>0)
137 1 {
138 2 Ping_Count--;
139 2 if(Ping_Count>0)
140 2 {
141 3 if((Ping_IP_TTL>0)||(Gateway_IP_TTL>0))
142 3 //ARP请求发送后,ARP回答会对请求分组中的IP地址进行解析,并设置全局变量的值
143 3 //如果是对网关的解析则将Gateway_IP_TTL的值置为10;若是对某一主机IP的解析则
144 3 //将Ping_IP_TTL的值置为10.
145 3 { //表示ip地址已经解析
146 4 //Printf_String("\r\nSend Ping Request...");
147 4 Ping_Request(); //发送PING请求
148 4 }
149 3 else
150 3 { //IP地址还没有解析
151 4 //Printf_String("\r\nSend ARP Request...\r\n ");
152 4 Arp_Request(Ping_Ip_Address.dwords); //发送ARP请求,对IP地址进行解析
153 4 }
154 3 if(Ping_Ip_Address.dwords==My_Ip_Address.dwords) //ping的是自己的ip地址
155 3 {
156 4 Printf_String("\r\nReply From IP="); //显示信息
157 4 Printf_IPStr(My_Ip_Address);
158 4 Printf_String(" Bytes=32 ");
159 4 Printf_String("TTL=10");
160 4 }
161 3
162 3 }//if(Ping_Count>0)
163 2 if(Ping_Count==0)
164 2 {
165 3 if(((Ping_Ip_Address.dwords!=My_Ip_Address.dwords)&(Ping_IP_TTL == 0))
166 3 ||((Ping_Ip_Address.dwords=Gateway_Ip_Address.dwords)&(Gateway_IP_TTL==0)))
167 3 Printf_String("\r\nRequest Timed out.\r\n");
168 3
169 3 Printf_String("\r\nPing Command Finished.\r\n");
170 3 Ping_IP_TTL=0;
171 3 }
172 2 }
173 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V7.06 ICMP 05/27/2008 11:02:07 PAGE 4
CODE SIZE = 855 ----
CONSTANT SIZE = 112 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -