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

📄 arp.c

📁 单片机以太网驱动程序
💻 C
字号:
typedef struct tagArpBuf{
	BYTE	cAddress[6];		// 硬件地址
	BYTE 	cpAddress[4];		// 协议地址
} ArpBuf;

BYTE	cAddress[6];		// 本机硬件地址
BYTE	cpAddress[4];		// 本机协议地址
int		nArp=0;				// 当前记忆的地址数量
ArpBuf	arpBuf[32];			// 最多解析32个主机地址

/*******************************************************************
ARP数据包处理函数               
函数原型:
ArpProcess ();  
功能:
准备ARP协议数据包。
参数:
	需要发送的ARP数据指针。
返回值:
	ARP数据处理结果。  
********************************************************************/
BOOL ArpProcess( ArpFrame* lparpFrame )
{
	if ( parpFrame->wHardwareType == ETHERNET )		//判断是否以太网数据
	{
		if ( parpFrame->chaLength != 6 )			
		{
			return FALSE;
		}
		if ( parpFrame->wProtocolType == IP_FRAME )	//判断是否ip数据
		{
			if (parpFrame->cpaLength != 4 )
			{
				return FALSE;
			}
			BOOL bMerge=FALSE;
			for( int nLoop = 0; nLoop < nArp; nLoop ++ )	//复制地址
			{
				if ( 0 == memcmp( arpBuf[nLoop].cpAddress, 	//比较ip地址
					parpFrame->cSrcpAddress, 4 ) )
				{
					memcpy( arpBuf[nLoop].cAddress, 		//复制硬件地址
						parpFrame->cSrcAddress, 6 );
					bMerge = TRUE;
					break;
				}
			}
			if ( 0 == memcmp( parpFrame->cDstpAddress,	//比较ip地址
				cpAddress ) )
			{
				if ( bMerge == FALSE &&
					nArp < 32 )
				{
					memcpy( arpBuf[nArp].cAddress, 
						parpFrame->cSrcAddress );
					memcpy( arpBuf[nArp].cpAddress,
						parpFrame->cSrcpAddress );
					nArp ++;
				}
				if ( parpFrame->wOperation == ARP_REQUEST )	//如果是ARP请求
				{
					ArpFrame arpFrame;
					memcpy( &arpFrame, parpFrame, 
						sizeof(ArpFrame) );
					arpFrame.wOperation = ARP_ECHOREQ;
					memcpy( arpFrame.cDstAddress, 
						parpFrame->cSrcAddress, 6 );
					memcpy( arpFrame.cDstpAddress, 
						parpFrame->cSrcpAddress, 4 );
					memcpy( arpFrame.cSrcAddress, 
						byAddress, 6 );
					memcpy( arpFrame.cSrcpAddress, 
						bypAddress, 4 );

					SendFrame( arpFrame.cDstAddress,	//目标地址
						&arpFrame,						//数据
						sizeof(ArpFrame),				//大小
						ARP_FRAME );					//数据帧类型
				}
			}
		}
	}
	return FALSE;
}

⌨️ 快捷键说明

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