📄 udp.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 + -