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

📄 global.lst

📁 51单片机上实现tcp/ip的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 434          **函数原型:   unsigned int CheckSum(unsigned int xdata *check,unsigned int length)
 435          **入口参数:   check    :    被校验数据起始地址
 436                        length   :    被校验数据长度,单位字
 437          **出口参数:   无
 438          **返 回 值:   ~((sum)&0xffff))               
 439          **说    明:   计算校验和 
 440          ************************************************************************/
 441          unsigned int CheckSum(unsigned int xdata *check,unsigned int length)
 442          {
 443   1        unsigned long sum=0;
 444   1        unsigned int i;
 445   1      
 446   1        for (i=0;i<(length)/2;i++)
 447   1        {
 448   2            sum += *check++;
 449   2        }
 450   1        if(length&0x01)                         //长度为奇数个时,要进行该操作
 451   1        {
 452   2            sum = sum + ((*check)&0xff00);
 453   2        }
 454   1        sum = (sum&0xffff) + ((sum>>16)&0xffff);//高16位和低16位相加
 455   1        if(sum & 0xffff0000)
 456   1        {//表示有进位
 457   2            sum++;
 458   2        }
 459   1        return ( (unsigned int)(~((sum)&0xffff))  );
 460   1      }
 461          
 462          /**********************************************************************
 463          **函数原型:   unsigned char  VerifyIpHeadCrc()
 464          **入口参数:   无
 465          **出口参数:   无
 466          **返 回 值:  0   :    校验错误
 467          **            1   :    校验正确       
 468          **说    明:  对IP头进行校验 
 469          ************************************************************************/
 470          unsigned char  VerifyIpHeadCrc()
 471          {
 472   1        unsigned int crc;
 473   1      
 474   1        crc = CheckSum(&RxdNetBuff.IpPacket.IpPacket[0],(RxdNetBuff.IpFrame.VerandIphLen&0x0f)*4);
 475   1              //1位代表1字节
 476   1        if(crc == 0)
 477   1        {
 478   2            return (1);
 479   2        }
 480   1        return(0);
 481   1      }
 482          
 483          /**********************************************************************
 484          **函数原型:   unsigned char  VerifyTcpCrc()
 485          **入口参数:   无
 486          **出口参数:   无
 487          **返 回 值:   0   : 校验错误
 488          **            1   : 校验正确       
 489          **说    明:   对TCP头进行校验 
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 9   

 490          ************************************************************************/
 491          unsigned char  VerifyTcpCrc()
 492          {
 493   1        unsigned int crc;
 494   1      
 495   1        RxdNetBuff.IpFrame.ttl=0;
 496   1        RxdNetBuff.IpFrame.Crc=RxdNetBuff.IpFrame.TotalLen-(RxdNetBuff.IpFrame.VerandIphLen&0x0f)*4;
 497   1        crc = CheckSum(&RxdNetBuff.IpPacket.IpPacket[4],RxdNetBuff.IpFrame.Crc+12);
 498   1        if(crc == 0)
 499   1        {
 500   2            return (1);
 501   2        }
 502   1        return(0);
 503   1      }
 504          
 505          /**********************************************************************
 506          **函数原型:   void     CreateIpHeadCrc()
 507          **入口参数:   无
 508          **出口参数:   无
 509          **返 回 值:   crc :  16位的校验和        
 510          **说    明:   产生IP首部的校验和 
 511          ************************************************************************/
 512          uint  CreateIpHeadCrc()
 513          {
 514   1        uchar i;
 515   1      
 516   1        CrcTemp.dwords = 0;
 517   1        for(i=9;i<19;i++)                              //IP首部共20字节
 518   1        {
 519   2            CrcTemp.dwords = CrcTemp.dwords + TxdNetBuff.words.wordbuf[i];
 520   2        }
 521   1        while(CrcTemp.words.high>0) 
 522   1        {
 523   2            CrcTemp.dwords = (ulong)(CrcTemp.words.high + CrcTemp.words.low);
 524   2        }
 525   1        CrcTemp.words.low = 0xffff - CrcTemp.words.low;  //取反
 526   1        return(CrcTemp.words.low);
 527   1      }
 528          
 529          /**********************************************************************
 530          **函数原型:   void     CreateIcmpCrc( )
 531          **入口参数:   无
 532          **出口参数:   无
 533          **返 回 值:  crc :  16位的校验和        
 534          **说    明:  产生ICMP数据段的校验和 
 535          ************************************************************************/
 536          uint  CreateIcmpCrc()//
 537          {
 538   1        uchar i;
 539   1      
 540   1        CrcTemp.dwords=0;
 541   1        for(i=19;i<39;i++)                //用于查询的ICMP报文共40字节
 542   1        {
 543   2            CrcTemp.dwords = CrcTemp.dwords + TxdNetBuff.words.wordbuf[i];
 544   2        }
 545   1        while(CrcTemp.words.high>0) 
 546   1        {
 547   2            CrcTemp.dwords = (ulong)(CrcTemp.words.high+CrcTemp.words.low);
 548   2        }
 549   1        CrcTemp.words.low = 0xffff - CrcTemp.words.low;
 550   1        return(CrcTemp.words.low);
 551   1      }
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 10  

 552          
 553          /**********************************************************************
 554          **函数原型:   unsigned char  VerifyUdpCrc()
 555          **入口参数:   无
 556          **出口参数:   无
 557          **返 回 值:  0   :  校验错误
 558          **            1   :    校验正确       
 559          **说    明:  对UDP头进行校验 
 560          ************************************************************************/
 561          unsigned char  VerifyUdpCrc()
 562          {
 563   1        unsigned int crc;
 564   1      
 565   1        RxdNetBuff.IpFrame.ttl = 0;
 566   1        RxdNetBuff.IpFrame.Crc = RxdNetBuff.IpFrame.TotalLen - (RxdNetBuff.IpFrame.VerandIphLen&0x0f)*4;
 567   1        crc = CheckSum(&RxdNetBuff.IpPacket.IpPacket[4],RxdNetBuff.IpFrame.Crc+12);
 568   1        if(crc==0)
 569   1        {
 570   2           return (1);
 571   2        }
 572   1        return(0);
 573   1      }
 574          
 575          /**********************************************************************
 576          **函数原型:    void     CreateTcpCrc()
 577          **入口参数:    无
 578          **出口参数:    无
 579          **返 回 值:    crc :  16位的校验和       
 580          **说    明:    产生TCP数据段的校验和 
 581          ************************************************************************/
 582          uint CreateTcpCrc()
 583          {
 584   1        uint crc;
 585   1      
 586   1        crc = CheckSum(&TxdNetBuff.IpPacket.IpPacket[4],TxdNetBuff.IpFrame.Crc+12);
 587   1        return (crc);
 588   1      }
 589          
 590          /**********************************************************************
 591          **函数原型:   void        Copy_To_Resend_Buff( )
 592          **入口参数:   无
 593          **出口参数:   无
 594          **返 回 值:   无
 595          **说    明:   将tcp包复制到重发缓冲区
 596          ************************************************************************/
 597          void Copy_To_Resend_Buff()
 598          {
 599   1        uint ii;
 600   1        uchar xdata *txd = &TxdNetBuff;
 601   1        uchar xdata *rt;
 602   1       
 603   1        if(Resend_Buff.ResendFrame.RtStatus==0)
 604   1        {
 605   2            rt = &Resend_Buff.bytes.bytebuf;
 606   2            for(ii=0;ii<Resend_Buff.ResendFrame.length+4;ii++)
 607   2            {
 608   3               (*rt)=(*txd);
 609   3                rt++;
 610   3                txd++;
 611   3            }
 612   2            Resend_Buff.ResendFrame.RtStatus = 1;        //状态1缓冲区数据有效,准备重发数据
 613   2            Resend_Buff.ResendFrame.timeout  = RtTime;    //重发次数
C51 COMPILER V7.06   GLOBAL                                                                05/27/2008 11:02:05 PAGE 11  

 614   2        }
 615   1      }
 616          
 617          /**********************************************************************
 618          **函数原型:   void         Create_Ip_Frame(uint length,uint IPH,uint IPL,uchar NextProtocal)
 619          **入口参数:   length       : TCP包的长度
 620          **            IPH          : IP地址的高16位
 621          **            IPL          : IP地址的低16位
 622          **            NextProtocal : 下一层协议,例如TCP协议或UDP协议
 623          **出口参数:   无
 624          **返 回 值:  无
 625          **说    明:  产生一个ip头,并启动发送
 626          ************************************************************************/
 627          void Create_Ip_Frame(uint length,uint IPH,uint IPL,uchar NextProtocal)
 628          { 
 629   1          TxdNetBuff.IpFrame.VerandIphLen=0x45;            //IP版本和头长度
 630   1          TxdNetBuff.IpFrame.ttl=128;                      //TTL
 631   1          TxdNetBuff.IpFrame.ServerType=0x00;              //服务类型为0
 632   1          TxdNetBuff.IpFrame.Crc=0;
 633   1          TxdNetBuff.IpFrame.FrameIndex=FrameIndex++;
 634   1          TxdNetBuff.IpFrame.Segment=0x4000;             //无分段
 635   1          length=length+20;
 636   1          TxdNetBuff.IpFrame.TotalLen=length;            //IP数据报总长度
 637   1          TxdNetBuff.IpFrame.NextProtocal=NextProtocal;  //下层协议
 638   1          TxdNetBuff.IpFrame.DestId[0]=IPH;              //填充目的IP地址
 639   1          TxdNetBuff.IpFrame.DestId[1]=IPL;
 640   1          TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];    //填充源IP地址
 641   1          TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
 642   1          TxdNetBuff.IpFrame.Crc=CreateIpHeadCrc();//产生IP头的检验和
 643   1          length=length+14;//6+6+2                 //加以太网协议的14字节数据,得到发送数据的长度
 644   1          Send_Packet(&TxdNetBuff,length);
 645   1          TxdNetBuff.EtherFrame.length=length;
 646   1          if(NextProtocal==6)                      //如果协议为TCP,则要考虑重发问题 
 647   1              if(TxdNetBuff.TcpFrame.control&(TCP_SYN|TCP_FIN|TCP_PSH|TCP_URG))
 648   1                  {Copy_To_Resend_Buff();}         //复制TCP数据到重发缓冲区
 649   1      }
 650          
 651          /**********************************************************************
 652          **函数原型:   union Ip_Address_Type *IP_Str2Hex(unsigned char *Str)
 653          **入口参数:   unsigned char *Str    :指向字符串的指针
 654          **出口参数:        &(ip.bytes[0])   :指向IP联合类型的指针
 655          **返 回 值:   IP联合类型的首地址

⌨️ 快捷键说明

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