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

📄 funcip.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include "network.h"

extern INT16U rom IPTxID;
extern INT8U rom IPAddress[4];			//The local IP address


extern INT16U swaps(INT16U v);
extern INT8U PPPSendPacket (INT8U rom *Buffer, INT16U len);
/***********************************************************************
Function : 	IPChecksum

Parameters : 	Data: A pointer to an array of Words
		Size: Size of the array

Date : 		August 2000

Desc : 		Obtains the IP checksum of an array of 16-bit words of size "Size"

***********************************************************************/
INT16U IPCheckSum (INT8U rom * Data, INT16U Size) {
	INT32U	Sum;
	INT16U  Temp;
	
	Sum = 0;
	while (Size-->0) {
		Temp = *Data;
		Temp = Temp <<8;
		Temp += *(Data+1);
		Sum += Temp;
		//Sum += ((INT32U)((*Data << 8) + *(Data+1)) & 0xFFFF);
		Data+=2;
	}

	Sum = (Sum >> 16) + (Sum & 0xFFFF);
	Sum += (Sum >> 16);

	return (INT16U) ~Sum;
}


//when called, the dest and src address has been set by the upper layer
void IPNetSend (INT8U rom * pD, INT16U Len) {

	INT8U rom * pT;
	
	pT = pD+4;

	pD[0] = 0xff;
	pD[1] = 0x03;
	pD[2] = 0x00;
	pD[3] = 0x21;

	((IPDATAGRAM *)pT)->VerHLen	= 0x45;					/* Header Forma=IPv4, Length = 5 DWORDs */
	((IPDATAGRAM *)pT)->Service 	= 0;							/* Always zero */
	((IPDATAGRAM *)pT)->LengthH 	= 0;						/* High byte of datagram Length */
	OS_ENTER_CRITICAL();
	((IPDATAGRAM *)pT)->ID 		= swaps(IPTxID);			/*Merge IP ID */
	OS_EXIT_CRITICAL();
	((IPDATAGRAM *)pT)->Frag 		= 0;						/* No flags nor enable fragmentation */
	((IPDATAGRAM *)pT)->TTL 		= 0x80;					/* Time to live set to default */
	((IPDATAGRAM *)pT)->Checksum 	= 0;							/* Clear checksum to avoid miscalculations */
	
	((IPDATAGRAM *)pT)->Checksum 	= swaps(IPCheckSum (pT, 10));	/* Get checksum of entire datagram */

	IPTxID++;
	PPPSendPacket (pD, Len+4);
}


INT8U rom *IPMakeHeader(IP_ADDR		  remoteAddr,
						INT8U   rom * pBuf,
						INT8U         Protocol,
						INT16U        LenOfPayload){
	
	((IPDATAGRAM *)pBuf)->VerHLen	= 0x45;					/* Header Forma=IPv4, Length = 5 DWORDs */
	((IPDATAGRAM *)pBuf)->Service 	= 0;							/* Always zero */
	((IPDATAGRAM *)pBuf)->LengthH 	= (LenOfPayload + IP_HEADLEN)>>8;						/* High byte of datagram Length */
	((IPDATAGRAM *)pBuf)->LengthL 	= (LenOfPayload + IP_HEADLEN)&0xff;
	OS_ENTER_CRITICAL();
	((IPDATAGRAM *)pBuf)->ID 		= swaps(IPTxID);			/*Merge IP ID */
	OS_EXIT_CRITICAL();
	((IPDATAGRAM *)pBuf)->Frag 		= 0;						/* No flags nor enable fragmentation */
	((IPDATAGRAM *)pBuf)->TTL 		= 0x80;					/* Time to live set to default */
	((IPDATAGRAM *)pBuf)->Protocol	= Protocol; 
	((IPDATAGRAM *)pBuf)->Checksum 	= 0;							/* Clear checksum to avoid miscalculations */

	((IPDATAGRAM *)pBuf)->SourceAddress[0] = IPAddress[0];
	((IPDATAGRAM *)pBuf)->SourceAddress[1] = IPAddress[1];
	((IPDATAGRAM *)pBuf)->SourceAddress[2] = IPAddress[2];
	((IPDATAGRAM *)pBuf)->SourceAddress[3] = IPAddress[3];

	((IPDATAGRAM *)pBuf)->DestAddress[0] = remoteAddr.v[0];
	((IPDATAGRAM *)pBuf)->DestAddress[1] = remoteAddr.v[1];
	((IPDATAGRAM *)pBuf)->DestAddress[2] = remoteAddr.v[2];
	((IPDATAGRAM *)pBuf)->DestAddress[3] = remoteAddr.v[3];

	
	((IPDATAGRAM *)pBuf)->Checksum 	= swaps(IPCheckSum (pBuf, 10));	/* Get checksum of entire datagram */
	OS_ENTER_CRITICAL();
	IPTxID++;
	OS_EXIT_CRITICAL();
	return(pBuf + IP_HEADLEN);
}

//these functions can be called by the application to extract IP address from received datagram
INT32U IPGetSrcAddress(INT8U rom * pD){
	pD += PPP_HEADLEN;
	pD = (INT8U rom *)(&(((IPDATAGRAM *)pD)->SourceAddress));
	return(*((INT32U rom*)pD));
}

INT32U IPGetDestAddress(INT8U rom * pD){
	pD += PPP_HEADLEN;
	pD = (INT8U rom *)(&(((IPDATAGRAM *)pD)->DestAddress));
	return(*((INT32U rom*)pD));
}

⌨️ 快捷键说明

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