⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icmp.lst

📁 51单片机上实现tcp/ip的源代码
💻 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 + -