?? 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 + -