设为首页 加入收藏

TOP

VS2012编写获取ARP命令(一)
2014-11-23 17:50:22 】 浏览:292
Tags:VS2012 编写 获取 ARP 命令


分享如下:

[cpp]
PMIB_IPNETTABLE MyGetIpNetTable(BOOL bOrder);
void MyFreeIpNetTable(PMIB_IPNETTABLE pIpNetTable);
PMIB_IPADDRTABLE MyGetIpAddrTable(BOOL bOrder);
void MyFreeIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable);
BOOL InterfaceIdxToInterfaceIp(PMIB_IPADDRTABLE pIpAddrTable,DWORD dwIndex,DWORD& dwIpAddr);

BOOL PrintARPTable();

/*
InterfaceIdxToInterfaceIp 根据IP地址表,将接口索引转化为IP地址
pIpAddrTable是IP地址表
dwIndex是接口索引
函数执行成功之后,str将包含接口的IP地址
*/
BOOL InterfaceIdxToInterfaceIp(PMIB_IPADDRTABLE pIpAddrTable,DWORD dwIndex,DWORD& dwIpAddr)
{

//遍历IP地址表,查找索引dwIndex对应的IP地址
for (DWORD dwIdx = 0;dwIdx < pIpAddrTable->dwNumEntries;dwIdx++)
{
if (dwIndex == pIpAddrTable->table[dwIdx].dwIndex)
{
// 返回查询结果
dwIpAddr = pIpAddrTable->table[dwIdx].dwAddr;//inet_ntoa(*((in_addr*)&pIpAddrTable->table[dwIdx].dwAddr));
if (dwIpAddr != 0)
{
return TRUE;
}
else
return FALSE;
}
}
return FALSE;
}

//获取IP地址到适配器的映射关系,即ARP表
PMIB_IPNETTABLE MyGetIpNetTable(BOOL bOrder)
{
PMIB_IPNETTABLE pIpNetTable = NULL;
DWORD dwActualSize = 0;

//查询所需缓冲区的大小
if (::GetIpNetTable(pIpNetTable,&dwActualSize,bOrder) == ERROR_INSUFFICIENT_BUFFER)
{
//为MIB_IPNETTABLE结构申请内存
pIpNetTable = (PMIB_IPNETTABLE)::GlobalAlloc(GPTR,dwActualSize);
//获取ARP表
if (::GetIpNetTable(pIpNetTable,&dwActualSize,bOrder) == NO_ERROR)
{
return pIpNetTable;
}
::GlobalFree(pIpNetTable);
}
return NULL;
}

void MyFreeIpNetTable(PMIB_IPNETTABLE pIpNetTable)
{
if (pIpNetTable != NULL)
{
::GlobalFree(pIpNetTable);
}
}

//获取IP地址表
PMIB_IPADDRTABLE MyGetIpAddrTable(BOOL bOrder)
{
PMIB_IPADDRTABLE pIpAddrTable = NULL;
DWORD dwActualSize = 0;

if (::GetIpAddrTable(pIpAddrTable,&dwActualSize,bOrder) == ERROR_INSUFFICIENT_BUFFER)
{
pIpAddrTable = (PMIB_IPADDRTABLE)::GlobalAlloc(GPTR,dwActualSize);
if (::GetIpAddrTable(pIpAddrTable,&dwActualSize,bOrder) == NO_ERROR)
{
return pIpAddrTable;
}
::GlobalFree(pIpAddrTable);
}
return NULL;
}

void MyFreeIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable)
{
if (pIpAddrTable != NULL)
{
::GlobalFree(pIpAddrTable);
}
}

BOOL PrintARPTable()
{
/*
ARP表格打印
*/
DWORD i=0,dwCurrIndex=1;
char szType[128] = {""};
DWORD dwIpAddr = 0;

//首先获取ARP表
PMIB_IPNETTABLE pIpNetTable = MyGetIpNetTable(TRUE);
if (pIpNetTable == NULL)
{
printf("pIpNetTable == NULL in line %d\n",__LINE__);
return FALSE;
}
//获取IP地址表,以便根据它将ARP表项中的接口索引转化为IP地址
PMIB_IPADDRTABLE pIpAddrTable = MyGetIpAddrTable(TRUE);
//当前的适配器索引。注意,ARP表应该按照接口索引排序
if (InterfaceIdxToInterfaceIp(pIpAddrTable,dwCurrIndex,dwIpAddr))
{
printf("\nInterface: %s on Interface 0x%X\n",inet_ntoa(*((in_addr*)&dwIpAddr)),dwCurrIndex);
printf(" Internet Address\tPhysical Address\tType\n");
}
else
{
printf("Error: Could not convert Interface number 0x%X to IP addre

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC编程实现运行Excel宏 Run 下一篇VC++网络编程-文件传输

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目