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

📄 udp.c

📁 用AVR单片机和RTL8019实现TCP/IP协议.支持ARP,PING,UDP,TCP,HTML网页显示等功能.
💻 C
字号:
//**********************************
//*版本: Test 1.0
//*作者: XUGUOHONG
//*E-MAIL: KK20Y@YAHOO.COM.CN
//*WEBSITE:microdesign.000webhost.com
//**********************************

#include <udp.h>
#include <icmp.h>
#include <ip.h>
#include <rtl8019as.h>
//**********************************
//*  系统 MAC地址设定(根据需要修正)
//**********************************
extern unsigned char SYSMAC[6];
//**********************************
//*  系统 IP地址设定(根据需要修正)
//**********************************
extern unsigned char SYSIP[4];

void udp(void);
void udp_reply_test(void);
void udp_rev(void);
void udp()
{
 udp_rev();
}
//**********************************
//*  UDP处理
//*处理子程序
//*根据不同的端口来处理不同的数据
//*0x9090为测试端口
//**********************************
void udp_rev(void)
{
 unsigned int port;                        // udp port
 port=read_62256(UDP_DES_PORT);            // xxab
 port=port<<8;                             // abxx
 port=port+read_62256(UDP_DES_PORT+1);     // abcd
 if(port==0x0008)
    //udp_p8();                            // 执行具体应用程序
	;
 else if(port==0x0088)
    //udp_p88();
	;
 else if(port==0x0888)
    //udp_p888();
	;
  else if(port==0x8888)
    //udp_p8888();
	;
  else if(port==0x9090)
  {
    udp_reply_test();                      // 原数据返回测试程序
  }
  else rtl8019as_init( );
}

//**********************************
//*  UDP原数据返回测试程序
//**********************************
void udp_reply_test(void)
{
 unsigned char temp0;
 unsigned char temp1;
 unsigned int temp2;
 unsigned int temp3;
 //修改ETHERNET数据包目标和源MAC地址
 for(temp0=0;temp0<6;temp0++)                   // 1. 设置目标MAC地址,MAC地址交换
 {
  temp1=read_62256(SRCMAC0+temp0);
  write_62256(DESMAC0+temp0,temp1);
 }
 for(temp0=0;temp0<6;temp0++)                   // 2. 设置本机MAC地址
  write_62256(SRCMAC0+temp0,SYSMAC[temp0]); 
 //对IP数据头进行处理,在已收到数据基础上修改
 temp2=read_62256(IP_ID_ADD);                   // 3. IP头数据中IP标识区数据加1
 temp1=read_62256(IP_ID_ADD+1);
 temp2=(temp2<<8)+temp1;
 temp2++;
 write_62256(IP_ID_ADD+1,temp2);
 write_62256(IP_ID_ADD,temp2>>8);
 
 write_62256(IP_HDR_CSUM,0x00);                // 4. IP头CHECKSUM部分至0x0000
 write_62256(IP_HDR_CSUM+1,0x00);
 
 for(temp0=0;temp0<4;temp0++)                  // 5. 设置目标IP地址
 {
  temp1=read_62256(IP_SRC_IP0+temp0);
  write_62256(IP_DES_IP0+temp0,temp1);
 }
 
 for(temp0=0;temp0<4;temp0++)
   write_62256(IP_SRC_IP0+temp0,SYSIP[temp0]); // 4. 设置本机IP地址
   
 temp2=ip_cal_csum();                          // 5. IP头chechsum计算
 write_62256(IP_HDR_CSUM+1,temp2);              
 write_62256(IP_HDR_CSUM,temp2>>8);
 //UDP数据段设置

 
 write_62256(UDP_CSUM,0x00);                    // UDP CHECKSUM部分至0x0000 temp0=read_62256(UDP_SRC_PORT);              // 端口互换
 temp1=read_62256(UDP_DES_PORT);
 write_62256(UDP_SRC_PORT,temp1);
 write_62256(UDP_DES_PORT,temp0);
 temp0=read_62256(UDP_SRC_PORT+1);
 temp1=read_62256(UDP_DES_PORT+1);
 write_62256(UDP_SRC_PORT+1,temp1);
 write_62256(UDP_DES_PORT+1,temp0);
 write_62256(UDP_CSUM+1,0x00);                  // UDP可以无chechsum
 
 
 temp2=read_62256(IP_TOL_LEN);                 // IP,UDP数据总长度
 temp1=read_62256(IP_TOL_LEN+1);                
 temp2=(temp2<<8)+temp1+0X0E; 
 if(temp2<60)                                  // 最小数据包长度检验
 {
  temp0=60-temp2;
  for(temp1=0;temp1<temp0;temp1++)
      write_62256(temp2+temp1,0x00);
  sendpacket(60); 
 }
 else sendpacket(temp2);                            //  发送数据  
}

⌨️ 快捷键说明

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