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

📄 udp.c

📁 ZLG的EASYARM8962开发板中IAR实验例程第六章
💻 C
字号:
#define UDP_GLOBALS
//#include "config.h"
//#include "../include/cfg_net.h"
#include "..\User\includes.h"

/**********************************************************************
**函数原型:	uint16 CheckSumUdp(uint8 *check,uint16 length)
**入口参数:?	check	:	被校验数据起始地址
		length	:	被校验数据长度,单位字
**出口参数:	无
**返 回 值:	~((sum)&0xffff))		       
**说    明:	计算校验和 
************************************************************************/
//=================================================================================
uint16 CheckSumUdp(uint8 *check,uint16 length)
{
uint32 sum=0;
uint16 i;
	for (i=0;i<(length)/2;i++)
	{
		sum = sum + ((uint32)check[2*i]<<8)+(uint32)check[2*i+1];
	}
	if(length&0x0001)//长度为奇数个时,要进行该操作
	{
		sum = sum + ((uint32)check[2*i]<<8);
	}
	sum = (sum&0xffff) + ((sum>>16)&0xffff);//高16位和低16位相加
	if(sum & 0xffff0000)
	{//表示有进位
		sum++;
	}
	return ( (uint16)(~((sum)&0xffff))  );
}

uint8 Udp_Process(Rec_Ptr * Udp_Rec) 
{
static uint8	UDP_REC_BUFF_NUM=0;
uint8	i,j;
	OS_ENTER_CRITICAL();
	memcpy (&(UdpRecBuff[UDP_REC_BUFF_NUM]), (*Udp_Rec).RecDataPtr, (*Udp_Rec).length);
	OS_EXIT_CRITICAL();
#ifdef Little_End
	UdpRecBuff[UDP_REC_BUFF_NUM].DestPort=swap_int16(UdpRecBuff[UDP_REC_BUFF_NUM].DestPort);
#endif
	i=0;
	do
	{
		if(UdpStatus[i].My_Port==UdpRecBuff[UDP_REC_BUFF_NUM].DestPort)//有可能组播
		{
			break;
		}
		i++;
	}
	while(i<MAX_UDP_LINKS);
	if(i>=MAX_UDP_LINKS)
	{
		Icmp_Send(3,3,((Rec_Ptr*)Udp_Rec)->My_Ip,((Rec_Ptr*)Udp_Rec)->ip, (*Udp_Rec).RecDataPtr-20 );
		return 0;
	}
	OS_ENTER_CRITICAL();
	j=0;
	do
	{
		if(UdpStatus[i].info[j].num==UdpMaxRec)
			break;
		j++;
	}
	while(j<UdpMaxRec);
	if(j>=UdpMaxRec)
	{
		OS_EXIT_CRITICAL();
		return (1);
	}
	UdpStatus[i].info[j].De_Port=UdpRecBuff[UDP_REC_BUFF_NUM].SourcePort;
#ifdef Little_End
	UdpStatus[i].info[j].De_Port=swap_int16(UdpStatus[i].info[j].De_Port);
#endif
	UdpStatus[i].info[j].De_Ip[0]=(*Udp_Rec).ip[0];
	UdpStatus[i].info[j].De_Ip[1]=(*Udp_Rec).ip[1];
	UdpStatus[i].info[j].De_Ip[2]=(*Udp_Rec).ip[2];
	UdpStatus[i].info[j].De_Ip[3]=(*Udp_Rec).ip[3];
	UdpStatus[i].info[j].num=UDP_REC_BUFF_NUM;
	UdpStatus[i].info[j].len=(*Udp_Rec).length;
	OS_EXIT_CRITICAL();
	UDP_REC_BUFF_NUM++;
	if(UDP_REC_BUFF_NUM>=UdpMaxRec)
		UDP_REC_BUFF_NUM=0;
	OSSemPost(UdpStatus[i].UdpSemRec);
	return (2);
}

void Udp_Initial(void)
{	
uint8 i,j;
	for(i=0;i<MAX_UDP_LINKS;i++)
	{
		UdpStatus[i].My_Port=0;
		UdpStatus[i].My_Ip[0]=0xff;
		UdpStatus[i].My_Ip[1]=0xff;
		UdpStatus[i].My_Ip[2]=0xff;
		UdpStatus[i].My_Ip[3]=0xff;
		UdpStatus[i].Rec_Sta=0;
		UdpStatus[i].UdpSemRec=OSSemCreate(0);
		for(j=0;j<UdpMaxRec;j++)
		{
			UdpStatus[i].info[j].De_Port=0;
			UdpStatus[i].info[j].num=UdpMaxRec;
			UdpStatus[i].info[j].len=0;
		}
	}
}


⌨️ 快捷键说明

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