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

📄 tcp.lst

📁 51单片机上实现tcp/ip的源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 167          **入口参数:     uchar   i
 168          **出口参数:     无
 169          **返 回 值:             无
 170          **功能说明:     重发出错的数据包
 171          ******************************************************************/
 172          void Resend_Packet()
 173          {
 174   1              uint ii;
 175   1              uchar xdata *txd=&TxdNetBuff;
 176   1              uchar xdata *rt;
 177   1              
 178   1              rt=&Resend_Buff.bytes.bytebuf;
 179   1              for(ii=0;ii<Resend_Buff.ResendFrame.length+4;ii++)
C51 COMPILER V7.06   TCP                                                                   05/27/2008 11:02:10 PAGE 4   

 180   1              {
 181   2                      (*txd)=(*rt);
 182   2                      rt++;
 183   2                      txd++;
 184   2              }
 185   1              Send_Packet(&TxdNetBuff,Resend_Buff.ResendFrame.length);
 186   1              Resend_Buff.ResendFrame.timeout=RtTime;
 187   1      }
 188          
 189          /**********************************************************************
 190          **函数原型:    void        Process_Resend_Buff( )
 191          **入口参数:     无
 192          **出口参数:     无
 193          **返 回 值:             无
 194          **功能说明:     根据接收数据的序号以及超时时间对重发缓冲区的数据进行处理
 195          ******************************************************************/
 196          void Process_Resend_Buff()
 197          {
 198   1              
 199   1              if(Resend_Buff.ResendFrame.timeout>0)
 200   1                      Resend_Buff.ResendFrame.timeout--;      //数据报的重发次数减一,防止TCP死锁
 201   1              if(Resend_Buff.EtherFrame.RecStatus!=0) //表示需要重发缓冲区的数据
 202   1              {
 203   2                      if(Resend_Buff.TcpFrame.SeqNum<TCP1024.Sent_UnAck)
 204   2                              //下一个待发送的数据的序号应该大于TCP1024.Sent_UnAck,因为
 205   2                              //tcp1024.snd_una表示上一个已发送的数据字节的序号,如果
 206   2                              //重发缓冲区的数据对应的序号小于TCP1024.Sent_UnAck,则说明数据
 207   2                              //已正确发送了,重发缓冲区内的备份的数据就没有用了,因此
 208   2                              //这个数据包已经过期了,可以抛弃掉,将缓冲区置为无效。
 209   2                      {
 210   3                              Resend_Buff.ResendFrame.RtStatus=0;
 211   3                      }//该缓冲区无效
 212   2                      
 213   2                      else if(Resend_Buff.ResendFrame.timeout==0)//超时,或重发次数到
 214   2                      {//如果重发缓冲区的数据包的序号大于等于未或确认的数据序号时待发送重发
 215   3                              Resend_Buff.ResendFrame.RtStatus++;//重发次数加一
 216   3                              if(Resend_Buff.ResendFrame.RtStatus==TCP_MAX_RETXD)
 217   3                              {       //重发TCP_MAX_RETXD次都无法正确发送时,撤销本地连接
 218   4                                      Delete_Socket();
 219   4                              }
 220   3                              else    //继续重发
 221   3                                      Resend_Packet();
 222   3                      }
 223   2              }
 224   1      }
 225          /**********************************************************************
 226          **函数原型:    void        Tcp_SYN_Sent( )
 227          **入口参数:     无
 228          **出口参数:     无
 229          **返 回 值:    无
 230          **功能说明:     本地机主动发送SYN后,即可进入本状态,该状态下,
 231          **        :     可接收几种数据:tcp_rst或tcp_syn或tcp_syn+tcp_ack
 232          ******************************************************************/
 233          void Tcp_SYN_Sent()
 234          {
 235   1              unsigned char i;
 236   1              if(((RxdNetBuff.TcpFrame.AckNum<=TCP1024.ISS)||(RxdNetBuff.TcpFrame.AckNum>TCP1024.Send_Next))
 237   1                      &&(RxdNetBuff.TcpFrame.control&TCP_ACK))
 238   1              {       //对方发回的确认号应是我的初始化序号加1,若比我的初始化序号小
 239   2                      //或大于我的下一个序号,则说明对方连接出错
 240   2                      if(!(RxdNetBuff.TcpFrame.control&TCP_RST))
 241   2                      {//对方不接受请求
C51 COMPILER V7.06   TCP                                                                   05/27/2008 11:02:10 PAGE 5   

 242   3                              TxdNetBuff.TcpFrame.SeqNum=RxdNetBuff.TcpFrame.AckNum;
 243   3                              TxdNetBuff.TcpFrame.AckNum=0;
 244   3                              TxdNetBuff.TcpFrame.control=TCP_RST;
 245   3                              Send_Reset();//复位对方连接
 246   3                      }
 247   2                      else//对方发来复位请求,因此撤销本地的连接
 248   2                      {
 249   3                              Delete_Socket();
 250   3                      }
 251   2              }
 252   1              else if(RxdNetBuff.TcpFrame.control&(TCP_SYN))
 253   1              {
 254   2                      TCP1024.IRS=RxdNetBuff.TcpFrame.SeqNum;                 //对方的初始化顺序号
 255   2                      TCP1024.Rcv_Next=RxdNetBuff.TcpFrame.SeqNum+1;  //对方的顺序号,我可以用于给对方确认
 256   2                      if(RxdNetBuff.TcpFrame.control&TCP_ACK)
 257   2                      {
 258   3                              TCP1024.Sent_UnAck=RxdNetBuff.TcpFrame.AckNum;//我的未或确认得序号
 259   3                              Process_Resend_Buff();
 260   3                      }
 261   2                      if(TCP1024.Sent_UnAck>=TCP1024.ISS)
 262   2                      {       //表示在一个由我发起的三次连接的过程中,对方已经对我的连接请求发回了确认
 263   3                              TCP1024.IRS=RxdNetBuff.TcpFrame.SeqNum;
 264   3                              TCP1024.Rcv_Window=RxdNetBuff.TcpFrame.window;  //对方的window大小,表示对方可以接收的最大数据包的大小
 265   3                              TCP1024.Dest_Max_Seg_Size=560;//默认为560
 266   3                              if(RxdNetBuff.TcpFrame.offset>20)
 267   3                                      if(RxdNetBuff.TcpFrame.tcpdata[0]==0x02)
 268   3                                              if(RxdNetBuff.TcpFrame.tcpdata[1]==0x04)//0204为最大segment选项
 269   3                                              {
 270   4                                                      TCP1024.Dest_Max_Seg_Size=RxdNetBuff.TcpFrame.tcpdata[2]*256+RxdNetBuff.TcpFrame.tcpdata[3];
 271   4                                              }
 272   3                                              //发送确认
 273   3                                              //===========以下建立应答帧
 274   3                                              for(i=0;i<3;i++)//目的网卡地址
 275   3                                              {
 276   4                                                      TxdNetBuff.EtherFrame.DestMacId[i]=TCP1024.Dest_Mac_Id[i];
 277   4                                              }
 278   3                                              TxdNetBuff.EtherFrame.NextProtocal=0x0800;//协议为ip协议
 279   3                                              TxdNetBuff.TcpFrame.SourcePort=TCP1024.My_Port;
 280   3                                              TxdNetBuff.TcpFrame.DestPort=TCP1024.Dest_Port;
 281   3                                              TxdNetBuff.TcpFrame.SeqNum=TCP1024.Send_Next;
 282   3                                              TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
 283   3                                              TxdNetBuff.TcpFrame.offset=0x50;
 284   3                                              TxdNetBuff.TcpFrame.control=TCP_ACK; 
 285   3                                              TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
 286   3                                              TxdNetBuff.TcpFrame.urg=0;
 287   3                                              TxdNetBuff.TcpFrame.Crc=0;
 288   3                                              TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
 289   3                                              TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
 290   3                                              TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
 291   3                                              TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
 292   3                                              TxdNetBuff.IpFrame.ttl=0;
 293   3                                              TxdNetBuff.IpFrame.NextProtocal=6;//tcp
 294   3                                              TxdNetBuff.IpFrame.Crc=20;
 295   3                                              TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
 296   3                                              Create_Ip_Frame(20,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
 297   3                                              TCP1024.State=TCP_STATE_ESTABLISHED;
 298   3                                              TcpConnected=1;
 299   3                                              Printf_String("\r\nOK,connected.\r\nC:>");
 300   3                      }
 301   2                      else 
 302   2                      {//说明对方同时发出连接请求
 303   3                              TCP1024.State=TCP_STATE_SYN_RCVD;
C51 COMPILER V7.06   TCP                                                                   05/27/2008 11:02:10 PAGE 6   

 304   3                              //===========下面建立应答帧
 305   3                              for(i=0;i<3;i++)//目的网卡地址
 306   3                              {
 307   4                                      TxdNetBuff.EtherFrame.DestMacId[i]=TCP1024.Dest_Mac_Id[i];
 308   4                              }
 309   3                              TxdNetBuff.EtherFrame.NextProtocal=0x0800;//以太网协议的下层协议为IP协议
 310   3                              TxdNetBuff.TcpFrame.SourcePort=TCP1024.My_Port;
 311   3                              TxdNetBuff.TcpFrame.DestPort=TCP1024.Dest_Port;
 312   3                              TxdNetBuff.TcpFrame.SeqNum=TCP1024.Send_Next;
 313   3                              TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
 314   3                              TxdNetBuff.TcpFrame.offset=0x70;
 315   3                              TxdNetBuff.TcpFrame.control=TCP_ACK+TCP_SYN; //TCP_ACK+TCP_SYN
 316   3                              TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
 317   3                              TxdNetBuff.TcpFrame.urg=0;
 318   3                              TxdNetBuff.TcpFrame.Crc=0;
 319   3                              TxdNetBuff.IpPacket.IpPacket[20]=0x0204;//有TCP选项
 320   3                              TxdNetBuff.IpPacket.IpPacket[21]=TCP1024.My_Max_Seg_Size;
 321   3                              TxdNetBuff.IpPacket.IpPacket[22]=0x0101;
 322   3                              TxdNetBuff.IpPacket.IpPacket[23]=0x0101;
 323   3                              TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
 324   3                              TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
 325   3                              TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
 326   3                              TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
 327   3                              TxdNetBuff.IpFrame.ttl=0;
 328   3                              TxdNetBuff.IpFrame.NextProtocal=6;
 329   3                              TxdNetBuff.IpFrame.Crc=28;
 330   3                              TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
 331   3                              Create_Ip_Frame(28,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
 332   3                      }
 333   2              }
 334   1      }
 335          /**********************************************************************
 336          **函数原型:    void        Tcp_SYN_Rec( )
 337          **入口参数:             无
 338          **出口参数:             无
 339          **返 回 值:

⌨️ 快捷键说明

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