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

📄 tcp.lst

📁 51单片机上实现tcp/ip的源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   TCP                                                                   05/27/2008 11:02:10 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TCP
OBJECT MODULE PLACED IN .\RUN\tcp.obj
COMPILER INVOKED BY: D:\Keil7_06\C51\BIN\C51.EXE tcp.c OBJECT(.\RUN\tcp.obj)

stmt level    source

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

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

 118   2                                      TxdNetBuff.TcpFrame.SeqNum=TCP1024.ISS;
 119   2                                      TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
 120   2                                      
 121   2                                      TxdNetBuff.TcpFrame.offset=0x70;
 122   2                                      TxdNetBuff.TcpFrame.control=0x12; //syn+ack
 123   2                                      TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
 124   2                                      TxdNetBuff.TcpFrame.urg=0;
 125   2                                      TxdNetBuff.TcpFrame.Crc=0;
 126   2                                      TxdNetBuff.IpPacket.IpPacket[20]=0x0204;//tcp选项
 127   2                                      TxdNetBuff.IpPacket.IpPacket[21]=TCP1024.My_Max_Seg_Size;
 128   2                                      TxdNetBuff.IpPacket.IpPacket[22]=0x0101;
 129   2                                      TxdNetBuff.IpPacket.IpPacket[23]=0x0101;
 130   2                                      TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
 131   2                                      TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
 132   2                                      TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
 133   2                                      TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
 134   2                                      TxdNetBuff.IpFrame.ttl=0;
 135   2                                      TxdNetBuff.IpFrame.NextProtocal=6;//tcp
 136   2                                      TxdNetBuff.IpFrame.Crc=28;
 137   2                                      TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
 138   2                                      Create_Ip_Frame(28,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
 139   2                                      TCP1024.State=TCP_STATE_SYN_RCVD;//Tcp_SYN_Rec;
 140   2              }
 141   1              else if(RxdNetBuff.TcpFrame.control&TCP_RST)
 142   1              {
 143   2                      ;//无操作
 144   2              }
 145   1              else    
 146   1              {
 147   2                      Send_Reset();
 148   2              }       
 149   1      }
 150          /**********************************************************************
 151          **函数原型:    void        Delete_Socket()
 152          **入口参数:     无
 153          **出口参数:     无
 154          **返 回 值:    无
 155          **功能说明:     撤销本地连接,并清空重发缓冲区
 156          ******************************************************************/
 157          void Delete_Socket()
 158          {
 159   1              TcpConnected=0;
 160   1              TCP1024.State=0;
 161   1              TCP1024.ISS=TCP1024.ISS+10;//
 162   1              Resend_Buff.EtherFrame.RecStatus=0;//表示该重发缓冲区没有数据
 163   1              Printf_String("Disconnect!\r\n");
 164   1      }
 165          /**********************************************************************
 166          **函数原型:    void        Resend_Packet( )

⌨️ 快捷键说明

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