[Win32]本地计算机网络信息的获取 (四)

2014-11-24 02:02:56 · 作者: · 浏览: 8
的函数
* DWORD GetNumberOfInterfaces(
* _out PDWORD pdwNumIf
* );
*
* 用于获取本地主机名、域名和DNS服务器信息的函数
* DWORD GetInterfaceInfo(
* _out PIP_INTERFACE_INFO pIfTable, // 接受本地计算机网络接口基本信息的结构体IP_INTERFACE_INFO
* _inout PULONG dwOutBufLen // 接到数据的大小
* );
*
typedef struct _IP_INTERFACE_INFO {
LONG NumAdapters;
IP_ADAPTER_INDEX_MAP Adapter[1];
} IP_INTERFACE_INFO,*PIP_INTERFACE_INFO;

* 用于保存计算机网络接口信息的结构体
* typedfe struct _IP_ADAPTER_INDEX_MAP{
* ULONG Index; // 网络适配器索引号
* WCHAR Name[MAX_ADAPTER_NAME]; // 网络适配器名称
* }IP_INTERFACE_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP;
**/

// 分配内存空间
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
// 释放内存空间
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

int GetInterfacesFunction() // 获取本地计算机网络接口的基本信息
{
// 获取网络接口的数量
DWORD dwNumIf; // 用于获取接口数量
DWORD dwRetVal; // 返回值
if(dwRetVal = GetNumberOfInterfaces(&dwNumIf) == NO_ERROR){
printf("本地网络接口数量为: %d\n", dwNumIf);
}
else{
printf("调用GetNumberOfInterfaces()函数时出现错误。\n");
}

// 获取网络接口的基本信息
PIP_INTERFACE_INFO pInfo; // 保存网络接口信息的结构体指针
ULONG ulOutBufLen = 0; // 保存获取数据的长度
int iReturn = 1; // 本函数的返回结果

// 第1次调用 GetInterfaceInfo,获取数据大小,保存到ulOutBufLen变量中
dwRetVal = GetInterfaceInfo(NULL, &ulOutBufLen);
if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) {
pInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen);
if (pInfo == NULL) {
printf("无法分配GetInterfaceInfo函数需要的内存空间。\n");
return 1;
}
}
// 第2次调用GetInterfaceInfo函数,获取需要的实际数据
dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);
if (dwRetVal == NO_ERROR) {
printf("网络适配器数量: %ld\n\n", pInfo->NumAdapters);
for (int i = 0; i < (int) pInfo->NumAdapters; i++) {
printf("网络适配器索引[%d]: %ld\n", i,
pInfo->Adapter[i].Index);
printf("网络适配器名称[%d]: %ws\n\n", i,
pInfo->Adapter[i].Name);
}
iReturn = 0;
} else if (dwRetVal == ERROR_NO_DATA) {
printf
("本地计算机上没有支持IPv4的网络适配器。\n");
iReturn = 0;
} else {
printf("GetInterfaceInfo调用失败: %d\n", dwRetVal);
iReturn = 1;
}

FREE(pInfo); // 释放内存空间
system("pause");
return (iReturn);
}


/**
* 获取本地计算机IP地址表的函数
* DWORD GetIpAddrTable(
* _out PMIB_IPADDRTABLE pIpAddrTable, // 接受获取到的本地计算机网络接口和IP地址的映射表
* _inout PULONG pdwSize, // 接收收到数据的大小
* _in BOOL bOrder // 获取到的映射表中是否按IP地址的升序排列
* );
*
* 用于保存IP地址表的PMIB_IPADDRTABLE结构体
* typedef struct _MIB_IPADDRTABLE{
* DWORD dwNumEntries; // 表示映射表中记录的数量
* MIB_IPADDRROW table[ANY_SIZE]; // MIB_IPADDRROW结构体数组
* }MIB_IPADDRTABLE, *PMIB_IPADDRTABLE;
*
* 用于保存IP地址的结构体
* typedef struct _MIB_IPADDRROW{
* DWORD dwAddr; // 网络字节序格式的IP地址
* DWORD dwIndex; // 与IP地址相关联的网络编号序号
* DWORD dwMask; // 网络字节序的子网掩码
* DWORD dwBCastAddr; // 网络字节序格式的广播地址
* DWORD dwReasmSize; // 已收到的数据报重装后的最大长度
* unsigned short unusedl; // 预留字段
* unsigned short wType; // IP地址的类型或状态
* }MIB_IPADDRROW, *PMIB_IPADDRROW;
**/

//#define MALLOC