📄 global.lst
字号:
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 + -