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

📄 udp.c

📁 51单片机加rt8019硬件平台,上web方案及详细代码
💻 C
字号:
//----------------------------------udp.c--------------------------------------
//#define DEBUG 

#include<string.h>	
#include"includes.h"

uint xdata sender_udpport;
ulong xdata sender_ipaddr;

void udp_echo_service(uchar xdata * inbuf, uint len)
{   
	udp_send(outbuf,inbuf+42,sender_ipaddr, ECHO_PORT, len);    
}

/*****************************************
UDP包发送
outbuf  发送缓冲区首地址
udpdata UDP数据首地址
ipaddr  目的IP地址
port    源端口
len     UDP数据包长度不包括首部
*****************************************/
void udp_send(uchar xdata * outbuf,uchar xdata * udpdata,ulong dest_ipaddr, uint port, uint len)
{
	ulong idata sum;
  	uint idata result; 
  	Udp_Header xdata * udp;
	Ip_Header xdata * ip;    
   
	udp = (Udp_Header xdata *)(outbuf + 34); //eth(14)+ip(20)
	ip = (Ip_Header xdata *)(outbuf + 14);   //eth(14)  

	udp->dest_port = sender_udpport;
	udp->source_port = port;
	udp->len = 8 + len;
	udp->checksum = 0;

	memcpy(&udp->msg_data, udpdata, len); 	

	ip->dest_ipaddr = dest_ipaddr;
	ip->source_ipaddr = myipaddr;	

	/*伪首部源地址和目标地址*/
	sum = (ulong)cksum(outbuf + 26, 8 + udp->len);			
	/*伪首部协议,UDP总长度*/
	sum += (ulong)0x0011;
	sum += (ulong)udp->len;	
	
	result = (uint)(sum + (sum >> 16));
	udp->checksum = ~result;

	ip_send(outbuf, dest_ipaddr, UDP_TYPE, udp->len);
}
/*****************************************
UDP包处理
len: UDP数据包长度包括8BYTE首部
*****************************************/
void udp_receive(uchar xdata * inbuf, uint len)
{
	ulong idata sum;
	uint idata result;
	Ip_Header xdata * ip;
	Udp_Header xdata * udp;     
 
	udp = (Udp_Header xdata *)(inbuf + 34);
	ip = (Ip_Header xdata *)(inbuf + 14);

	if (len < udp->len) 
		return; 		   
	
	if (udp->checksum == 0)	{ }//对方没作校验
	else
	{		
		sum = (ulong)cksum(inbuf + 26, 8 + udp->len);		
		sum += (ulong)0x0011;     
		sum += (ulong)udp->len;
		result = (uint)(sum + (sum >> 16));
		
		if (result != 0xFFFF)		
			return;
	}
	sender_udpport = udp->source_port;
	sender_ipaddr = ip->source_ipaddr; 				      


	switch (udp->dest_port)
	{
		case ECHO_PORT:
		case CUSTOM_PORT:	//如是测试自定义端口,则返回收到的数据
			TRACE("RECV > ECHO_PORT",NULL,0,0); 
			udp_echo_service(inbuf, udp->len - 8);
		break;

		default:
			TRACE("udp->dest_port = ",CP &udp->dest_port,2,0); 
			dest_unreach_send(outbuf,inbuf, ip->source_ipaddr);	  //发送icmp差错报文,端口不可达
		break;
	}
}

⌨️ 快捷键说明

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