GetIpAddrTable函数返回与系统关联的IP地址信息,填充一个MIB_IPADDRTABLE结构指针。
使用GetIpAddrTable
1.声明一个MIB_IPADDRTABLE结构指针pIPAddrTable,一个DWORD变量dwSize。这些变量作为参数传递给GetIpAddrTable函数。定义一个DWORD变量dwRetVal(用于检错)。
MIB_IPADDRTABLE *pIPAddrTable;
DWORD dwSize = 0;
DWORD dwRetVal;
2.为结构分配内存。
注:dwSize指定的大小不足以缓冲数据,参看下一步。
pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );
3.进行第一次GetIpAddrTable调用获取适当的dwSize变量大小。
注:这是有意的失败调用,用以确定足够的dwSize缓冲区大小,以缓冲返回至pIPAddrTable的所有数据。这种方法是此类结构和函数的常用编程模式。
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
free( pIPAddrTable );
pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
}
4.进行第二次GetIpAddrTable调用并使用一般的错误检查,错误信息返回至DWORD变量dwRetVal,用于更多高级的错误检查。
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
printf("GetIpAddrTable call failed with %d/n", dwRetVal);
}
5.如果调用成功,通过pIPAddrTable结构访问数据。
printf("IP Address: %ld/n", pIPAddrTable->table[0].dwAddr);
printf("IP Mask: %ld/n", pIPAddrTable->table[0].dwMask);
printf("IF Index: %ld/n", pIPAddrTable->table[0].dwIndex);
printf("Broadcast Addr: %ld/n", pIPAddrTable->table[0].dwBCastAddr);
printf("Re-assembly size: %ld/n", pIPAddrTable->table[0].dwReasmSize);
6.释放为pIPAddrTable结构分配的内存。
if (pIPAddrTable)
free(pIPAddrTable);
注:DWORD变量dwAddr和dwMask返回的是本机字节序的数字值,不是网络字节序,这些值不是带点的IP地址。
//调用GetIpAddrTable示例代码:修改自MSDN。
//在vc++2008下编译通过。/花指令 点。点。记事本
#pragma comment(lib, "IPHLPAPI.lib")
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
int main()
{
MIB_IPADDRTABLE *pIPAddrTable;
DWORD dwSize = 0;
DWORD dwRetVal;
pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
free( pIPAddrTable );
pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
}
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
printf("GetIpAddrTable call failed with %d/n", dwRetVal);
}
printf("IP Address: %ld/n", pIPAddrTable->table[0].dwAddr);
printf("IP Mask: %ld/n", pIPAddrTable->table[0].dwMask);
printf("IF Index: %ld/n", pIPAddrTable->table[0].dwIndex);
printf("Broadcast Addr: %ld/n", pIPAddrTable->table[0].dwBCastAddr);
printf("Re-assembly size: %ld/n", pIPAddrTable->table[0].dwReasmSize);
if (pIPAddrTable)
free(pIPAddrTable);
return 0;
}