使用 GetInterfaceInfo 管理接口
GetInterfaceInfo 函数使用与系统关联的接口的相关信息填充指向 IP_INTERFACE_INFO 结构的指针。
使用 GetInterfaceInfo
声明指向名为
pInfo
的 IP_INTERFACE_INFO 对象的指针和名为 的ulOutBufLen
ULONG 对象。 此外,声明一个名为dwRetVal
(DWORD 对象,用于) 进行错误检查。ULONG ulOutBufLen; DWORD dwRetVal; unsigned int i; IP_INTERFACE_INFO* pInterfaceInfo;
为结构分配内存。
注意
的大小
ulOutBufLen
不足以保存信息。 查看下一步。pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(sizeof (IP_INTERFACE_INFO)); ulOutBufLen = sizeof(IP_INTERFACE_INFO);
对 GetInterfaceInfo 进行初始调用,以获取变量中
ulOutBufLen
所需的大小。注意
对 函数的此调用意味着失败,用于确保
ulOutBufLen
变量指定的大小足以保存返回给pInfo
的所有信息。 这是 IP 帮助器中用于此类型的数据结构和函数的常见编程模型。if (GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) { free(pInterfaceInfo); pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(ulOutBufLen); }
使用常规错误检查对 GetInterfaceInfo 进行第二次调用,并将其值返回到 DWORD 变量
dwRetVal
(,以便) 进行更高级的错误检查。if ((dwRetVal = GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen)) != NO_ERROR) { printf(" GetInterfaceInfo failed with error: %d\n", dwRetVal); }
如果调用成功,请从
pInfo
数据结构访问数据。printf(" GetInterfaceInfo succeeded.\n"); printf(" Num Adapters: %ld\n\n", pInterfaceInfo->NumAdapters); for (i = 0; i < (unsigned int) pInterfaceInfo->NumAdapters; i++) { printf(" Adapter Index[%d]: %ld\n", i, pInterfaceInfo->Adapter[i].Index); printf(" Adapter Name[%d]: %ws\n\n", i, pInterfaceInfo->Adapter[i].Name); } }
注意
第一行中的 %ws 表示宽字符串。 之所以使用此方法,是因为 IP_ADAPTER_INDEX_MAP 结构的
Adapter
Name 属性是 WCHAR,它是 Unicode 字符串。释放为 pInfo 结构分配的任何内存。
if (pInterfaceInfo) { free(pInterfaceInfo); pInterfaceInfo = NULL; }
下一步: 使用 GetIpAddrTable 管理 IP 地址
上一步: 使用 GetAdaptersInfo 管理网络适配器