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

📄 ip._c

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 _C
字号:
#include "main.h"
#include "rtl8019as.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"

extern unsigned int ip_id;
extern unsigned char tempip_d3;
extern unsigned char tempip_d2;
extern unsigned char tempip_d1;
extern unsigned char tempip_d0;
unsigned char tempip_d3;
unsigned char tempip_d2;
unsigned char tempip_d1;
unsigned char tempip_d0;

unsigned char ip_packhandle(unsigned char *ipbegin)
{
 unsigned char handleok=0;
 unsigned char ipheadlen=0;
 unsigned int totallen=0;
 unsigned int ippackid=0;
 unsigned int offset=0;
 unsigned char protocol=0;
 unsigned char sou_ip3=0;
 unsigned char sou_ip2=0;
 unsigned char sou_ip1=0;
 unsigned char sou_ip0=0; 
 unsigned int ipcksum=0;
 
 if((*(ipbegin+16)!=myip_3) || //匹配本地IP,不匹配者忽略
      (*(ipbegin+17)!=myip_2) ||
	  (*(ipbegin+18)!=myip_1) ||
	  (*(ipbegin+19)!=myip_0)
	 )
	 {
	  return 0;
	 }
 
 ipheadlen=((*ipbegin)&0x0F); //获取ip头长度
 ipheadlen<<=2;
 totallen=*(ipbegin+2);       //获取总长度
 totallen<<=8;
 totallen|=*(ipbegin+3);
 
 ippackid=*(ipbegin+4);       //获取ip包id
 ippackid<<=8;
 ippackid|=*(ipbegin+5);
 
 offset=*(ipbegin+6);         //获取包偏移量
 offset<<=8;
 offset|=*(ipbegin+7);
 
 protocol=*(ipbegin+9);       //获取协议类型
  
 sou_ip3=*(ipbegin+12);       //获取源IP
 sou_ip2=*(ipbegin+13);
 sou_ip1=*(ipbegin+14);
 sou_ip0=*(ipbegin+15);
 
 tempip_d3=sou_ip3;
 tempip_d2=sou_ip2;
 tempip_d1=sou_ip1;
 tempip_d0=sou_ip0; 
 
 switch(protocol)
 {
  case 1:             //ICMP协议
       if(icmp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
	   {	   
	    ip_id++;       //生成IP标识
	    *(ipbegin+4)=(ip_id>>8)&0xFF;
	    *(ipbegin+5)=(ip_id&0xFF);
	    
	    *(ipbegin+10)=0;//求头部校验和
	    *(ipbegin+11)=0;
	    ipcksum=tsum((unsigned int *)ipbegin,ipheadlen); //校验和的求法
	    *(ipbegin+10)=ipcksum&0xFF;
	    *(ipbegin+11)=(ipcksum>>8)&0xFF;
	   
	    *(ipbegin+12)=myip_3;//写入本地IP
	    *(ipbegin+13)=myip_2;
	    *(ipbegin+14)=myip_1;
	    *(ipbegin+15)=myip_0;
	   
	    *(ipbegin+16)=sou_ip3;//写入远程IP
	    *(ipbegin+17)=sou_ip2;
	    *(ipbegin+18)=sou_ip1;
	    *(ipbegin+19)=sou_ip0;
		break;  
	   }
	    protocol=0;
        break;  
  case 6:             //TCP协议
       break;
	   
  case 17:            //UDP协议
       if(udp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
	   {
	    break;
	   }
       protocol=0;
	   
  default:break;
 }
 
 return(protocol);
} 

void ip_buildpack(unsigned char *ipsendbuffer,
                  unsigned int totallen,
                  unsigned int ipid,
				  unsigned char protocol,
				  unsigned char des_ip3,
				  unsigned char des_ip2,
				  unsigned char des_ip1,
				  unsigned char des_ip0
				 )
{
 unsigned char i=0;
 unsigned int sum=0;
 
 *ipsendbuffer=0x45;      //版本4,头部长20
 *(ipsendbuffer+1)=0x00;  //服务类型
 *(ipsendbuffer+2)=totallen>>8;
 *(ipsendbuffer+3)=(totallen&0xFF);
 *(ipsendbuffer+4)=ipid>>8;
 *(ipsendbuffer+5)=(ipid&0xFF);
 *(ipsendbuffer+6)=0;
 *(ipsendbuffer+7)=0;
 *(ipsendbuffer+8)=128;
 *(ipsendbuffer+9)=protocol;
 *(ipsendbuffer+10)=0;
 *(ipsendbuffer+11)=0;
 *(ipsendbuffer+12)=myip_3;
 *(ipsendbuffer+13)=myip_2;
 *(ipsendbuffer+14)=myip_1;
 *(ipsendbuffer+15)=myip_0;
 *(ipsendbuffer+16)=des_ip3;
 *(ipsendbuffer+17)=des_ip2;
 *(ipsendbuffer+18)=des_ip1;
 *(ipsendbuffer+19)=des_ip0;
 
 sum=tsum((unsigned int *)ipsendbuffer,20); //校验和的求法
 *(ipsendbuffer+10)=(sum&0xFF);
 *(ipsendbuffer+11)=(sum>>8)&0xFF;
 
 totallen-=20;
 
 switch(protocol)
 {
  case 17:
       udp_buildpack((ipsendbuffer+20),totallen,localport_udp_port00,remoteport_udp_port00);
	   udp_builddata((ipsendbuffer+20),&udpsendbuffer_ex[0],totallen-8);
       break;
	   
  default:break;
 }
  
}

⌨️ 快捷键说明

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