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

📄 tcp.lst

📁 RTL8019AS以太网控制器以寄存器(16K的RAM)为核心
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   TCP                                                                   12/07/2004 08:46:35 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TCP
OBJECT MODULE PLACED IN tcp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE tcp.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*********************************************************************
   2           *文件名称:     tcp.c
   3           *文件标识: 
   4           *摘    要: 在事件的驱动下,按照状态转移图进行TCP协议的处理
   5           *
   6           *********************************************************************/
   7          #define  TCP_GLOBALS
   8          #include "net_cfg.h"
   9          
  10          /*****************************************************************
  11          **函数原型:     void    TCP1024_Init()
  12          **入口参数:     无
  13          **出口参数:     无
  14          **返 回 值:             无
  15          **功能说明:     初始化任务控制块,使本地机进入listen状态并清空重发缓冲区
  16          ******************************************************************/
  17          void TCP1024_Init()
  18          {
  19   1      TCP1024.State=0;
  20   1      TCP1024.My_Port=MY_TCP_PORT;
  21   1      TCP1024.Send_Next=0x0000;
  22   1      Resend_Buff.EtherFrame.RecStatus=0;//表示该重发缓冲区没有数据
  23   1      
  24   1      }
  25          
  26          //==============================================================
  27          /**********************************************************************
  28          **函数原型:    void        Send_Reset()
  29          **入口参数:     无
  30          **出口参数:     无
  31          **返 回 值:             无
  32          **功能说明:     发送TCP_RST数据报文,复位对方连接
  33          ******************************************************************/
  34          void Send_Reset()
  35          { 
  36   1      uchar i;
  37   1      for(i=0;i<3;i++)
  38   1              {
  39   2              TxdNetBuff.EtherFrame.DestMacId[i]=RxdNetBuff.EtherFrame.SourceMacId[i];//目的网卡地址
  40   2              }
  41   1      TxdNetBuff.EtherFrame.NextProtocal=0x0800;//协议为ip协议
  42   1      TxdNetBuff.TcpFrame.SourcePort=RxdNetBuff.TcpFrame.DestPort;
  43   1      TxdNetBuff.TcpFrame.DestPort=RxdNetBuff.TcpFrame.SourcePort;
  44   1      TxdNetBuff.TcpFrame.offset=0x50;
  45   1      TxdNetBuff.TcpFrame.window=0;
  46   1      TxdNetBuff.TcpFrame.urg=0;
  47   1      TxdNetBuff.TcpFrame.Crc=0;
  48   1      TxdNetBuff.IpFrame.DestId[0]=RxdNetBuff.IpFrame.SourceIp[0];
  49   1      TxdNetBuff.IpFrame.DestId[1]=RxdNetBuff.IpFrame.SourceIp[1];
  50   1      TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
  51   1      TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
  52   1      TxdNetBuff.IpFrame.ttl=0;
  53   1      TxdNetBuff.IpFrame.NextProtocal=6;//tcp
  54   1      TxdNetBuff.IpFrame.Crc=20;
  55   1      TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
C51 COMPILER V7.06   TCP                                                                   12/07/2004 08:46:35 PAGE 2   

  56   1      Create_Ip_Frame(20,RxdNetBuff.IpFrame.SourceIp[0],RxdNetBuff.IpFrame.SourceIp[1],6);
  57   1      }
  58          
  59          /**********************************************************************
  60          **函数原型:    void        Tcp_Listen( )
  61          **入口参数:     无
  62          **出口参数:     无
  63          **返 回 值:    无
  64          **功能说明:     本地机进入listen状态,可以对TCP_SYN或TCP_FIN请求进行处理
  65          ******************************************************************/
  66          void Tcp_Listen()
  67          {
  68   1              uchar i;
  69   1              /*if(RxdNetBuff.TcpFrame.control&(TCP_FIN))//reset
  70   1              {Send_Reset();}                 //对方不接受请求,
  71   1              else*/
  72   1              if(RxdNetBuff.TcpFrame.control&TCP_SYN)//表示这是一个请求连接
  73   1              {
  74   2                      for(i=0;i<2;i++)                //对方的ip地址
  75   2                              {TCP1024.Dest_Ip[i]=RxdNetBuff.IpFrame.SourceIp[i];}
  76   2                      for(i=0;i<3;i++)                //对方的以太网地址或网关地址
  77   2                              {TCP1024.Dest_Mac_Id[i]=RxdNetBuff.EtherFrame.SourceMacId[i];}
  78   2                      TCP1024.My_Port=MY_TCP_PORT;    //本机端口
  79   2                      TCP1024.Dest_Port=RxdNetBuff.TcpFrame.SourcePort;//对方端口
  80   2                      TCP1024.IRS=RxdNetBuff.TcpFrame.SeqNum;                 //对方的初始化顺序号
  81   2                      TCP1024.Rcv_Next=RxdNetBuff.TcpFrame.SeqNum+1;  //对方的顺序号,用于确认
  82   2                      TCP1024.ISS=TCP1024.Send_Next;                                  //我的初始化顺序号
  83   2                      TCP1024.Sent_UnAck=TCP1024.ISS;                                 //我的未确认得序号
  84   2                      TCP1024.Send_Next=TCP1024.ISS+1;                                //我的顺序号,用于发送
  85   2                      TCP1024.My_Wl1=RxdNetBuff.TcpFrame.SeqNum;              //seq
  86   2                      TCP1024.My_Wl2=TCP1024.Send_Next;                               //
  87   2                      TCP1024.Rcv_Window=RxdNetBuff.TcpFrame.window;  //对方的WINDOW大小
  88   2                      TCP1024.Snd_Window=1024;                                                //通知对方本地最大接收1024字节的包,用于流控
  89   2                      TCP1024.Dest_Max_Seg_Size=560;                                  //默认为560
  90   2                      if(RxdNetBuff.TcpFrame.offset>20)
  91   2                      if(RxdNetBuff.TcpFrame.tcpdata[0]==0x02)
  92   2                      if(RxdNetBuff.TcpFrame.tcpdata[1]==0x04)                //0204为最大segment选项
  93   2                      {
  94   3                              TCP1024.Dest_Max_Seg_Size=RxdNetBuff.TcpFrame.tcpdata[2]*256+RxdNetBuff.TcpFrame.tcpdata[3];
  95   3                      }
  96   2                      TCP1024.My_Max_Seg_Size=1460;//本地机可以接受最大的以太网数据包
  97   2                      //===========以下建立应答帧
  98   2                      for(i=0;i<3;i++)//目的网卡地址
  99   2                              {TxdNetBuff.EtherFrame.DestMacId[i]=TCP1024.Dest_Mac_Id[i];}
 100   2                      TxdNetBuff.EtherFrame.NextProtocal=0x0800;//协议为ip协议
 101   2                      TxdNetBuff.TcpFrame.SourcePort=TCP1024.My_Port;
 102   2                      TxdNetBuff.TcpFrame.DestPort=TCP1024.Dest_Port;
 103   2                      TxdNetBuff.TcpFrame.SeqNum=TCP1024.ISS;
 104   2                      TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
 105   2      
 106   2                      TxdNetBuff.TcpFrame.offset=0x70;
 107   2                      TxdNetBuff.TcpFrame.control=0x12; //syn+ack
 108   2                      TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
 109   2                      TxdNetBuff.TcpFrame.urg=0;
 110   2                      TxdNetBuff.TcpFrame.Crc=0;
 111   2                      TxdNetBuff.IpPacket.IpPacket[20]=0x0204;//tcp选项
 112   2                      TxdNetBuff.IpPacket.IpPacket[21]=TCP1024.My_Max_Seg_Size;
 113   2                      TxdNetBuff.IpPacket.IpPacket[22]=0x0101;
 114   2                      TxdNetBuff.IpPacket.IpPacket[23]=0x0101;
 115   2                      TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
 116   2                      TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
 117   2                      TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
C51 COMPILER V7.06   TCP                                                                   12/07/2004 08:46:35 PAGE 3   

 118   2                      TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
 119   2                      TxdNetBuff.IpFrame.ttl=0;
 120   2                      TxdNetBuff.IpFrame.NextProtocal=6;//tcp
 121   2                      TxdNetBuff.IpFrame.Crc=28;
 122   2                      TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
 123   2                      Create_Ip_Frame(28,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
 124   2                      TCP1024.State=TCP_STATE_SYN_RCVD;//Tcp_SYN_Rec;
 125   2              }
 126   1              else if(RxdNetBuff.TcpFrame.control&TCP_RST)
 127   1                      {;}
 128   1              else    
 129   1                      {Send_Reset();} 
 130   1      }
 131          /**********************************************************************
 132          **函数原型:    void        Delete_Socket()
 133          **入口参数:     无
 134          **出口参数:     无
 135          **返 回 值:    无
 136          **功能说明:     撤销本地连接,并清空重发缓冲区
 137          ******************************************************************/
 138          void Delete_Socket()
 139          {
 140   1      TcpConnected=0;
 141   1      TCP1024.State=0;
 142   1      TCP1024.ISS=TCP1024.ISS+10;//
 143   1      Resend_Buff.EtherFrame.RecStatus=0;//表示该重发缓冲区没有数据
 144   1      Printf_String("Disconnect!\r\n");
 145   1      }
 146          /**********************************************************************
 147          **函数原型:    void        Resend_Packet( )
 148          **入口参数:     uchar   i
 149          **出口参数:     无
 150          **返 回 值:             无
 151          **功能说明:     重发出错的数据包
 152          ******************************************************************/
 153          void Resend_Packet()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -