使用 GetInterfaceInfo 管理接口

GetInterfaceInfo 函数使用与系统关联的接口的相关信息填充指向 IP_INTERFACE_INFO 结构的指针。

使用 GetInterfaceInfo

  1. 声明指向名为 pInfo的 IP_INTERFACE_INFO 对象的指针和名为 的 ulOutBufLenULONG 对象。 此外,声明一个名为 dwRetVal (DWORD 对象,用于) 进行错误检查。

        ULONG               ulOutBufLen;
        DWORD               dwRetVal;
        unsigned int       i;
    
        IP_INTERFACE_INFO*  pInterfaceInfo;
    
  2. 为结构分配内存。

    注意

    的大小 ulOutBufLen 不足以保存信息。 查看下一步。

     

        pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(sizeof (IP_INTERFACE_INFO));
        ulOutBufLen = sizeof(IP_INTERFACE_INFO);
    
    
  3. GetInterfaceInfo 进行初始调用,以获取变量中 ulOutBufLen 所需的大小。

    注意

    对 函数的此调用意味着失败,用于确保 ulOutBufLen 变量指定的大小足以保存返回给 pInfo的所有信息。 这是 IP 帮助器中用于此类型的数据结构和函数的常见编程模型。

     

        if (GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen) ==
            ERROR_INSUFFICIENT_BUFFER) {
            free(pInterfaceInfo);
            pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(ulOutBufLen);
        }
    
  4. 使用常规错误检查对 GetInterfaceInfo 进行第二次调用,并将其值返回到 DWORD 变量 dwRetVal (,以便) 进行更高级的错误检查。

        if ((dwRetVal = GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen)) != NO_ERROR) {
            printf("  GetInterfaceInfo failed with error: %d\n", dwRetVal);
        }
    
  5. 如果调用成功,请从 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 结构的 AdapterName 属性是 WCHAR,它是 Unicode 字符串。

     

  6. 释放为 pInfo 结构分配的任何内存。

        if (pInterfaceInfo) {
            free(pInterfaceInfo);
            pInterfaceInfo = NULL;
        }
    

下一步: 使用 GetIpAddrTable 管理 IP 地址

上一步: 使用 GetAdaptersInfo 管理网络适配器