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