/*判断是否能够路由到指定的IP
Parameters
ARemote : 用来确定网卡的远程地址
Returns
在以下情况下,返回false:
1.无法路由到远程地址;
2.网卡被禁用或网卡断开连接
否则,返回true
*/
bool __fastcall CanRouteTo(const in_addr &ARemote)
{
MIB_IFTABLE *ATable;
DWORD ASize=0;
int ARetVal=0;//Unknown
if(GetIfTable(NULL,&ASize,false)==ERROR_INSUFFICIENT_BUFFER)
{
ATable=(MIB_IFTABLE *)malloc(ASize);
PMIB_IPFORWARDTABLE pIpForwardTable=NULL;
try
{
if(GetIfTable(ATable,&ASize,false)==ERROR_SUCCESS)
{
ASize=0;
int ALastMatric;
if(GetIpForwardTable(pIpForwardTable, &ASize, false)==ERROR_INSUFFICIENT_BUFFER)
{
pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(ASize);
if(GetIpForwardTable(pIpForwardTable, &ASize, false)==ERROR_SUCCESS)
{
for(int j=0; (jdwNumEntries)&&(ARetVal==0); j++)
{
if((pIpForwardTable->table[j].dwForwardMask&ARemote.S_un.S_addr)==pIpForwardTable->table[j].dwForwardDest)
{
if(pIpForwardTable->table[j].dwForwardType>=3)
{
for(DWORD i=0; idwNumEntries; i++)
{
if(pIpForwardTable->table[j].dwForwardIfIndex==ATable->table[i].dwIndex)
{
switch(ATable->table[i].dwOperStatus)
{
case MIB_IF_OPER_STATUS_OPERATIONAL:
case MIB_IF_OPER_STATUS_CONNECTED:
ARetVal=1;//Connected
break;
default:
ARetVal=2;//Disconnected
break;
}
break;
}
}
}
}
}
}
}
}
}
__finally
{
free(ATable);
if(pIpForwardTable)
free(pIpForwardTable);
}
}
return (ARetVal==1);
}