使用 GetAdaptersInfo 管理网络适配器

GetAdaptersInfo 函数使用与系统关联的网络适配器的相关信息填充指向IP_ADAPTER_INFO结构的指针。

使用 GetAdaptersInfo

  1. 声明指向名为 pAdapterInfo的IP_ADAPTER_INFO变量的指针,以及一个名为 ulOutBufLen 的ULONG 变量。 这些变量作为参数传递给 GetAdaptersInfo 函数。 此外,创建名为 dwRetVal (的 DWORD 变量,用于) 进行错误检查。

    IP_ADAPTER_INFO  *pAdapterInfo;
    ULONG            ulOutBufLen;
    DWORD            dwRetVal;
    
    
  2. 为结构分配内存。

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

    注意

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

     

    if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) {
        free (pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen );
    }
    
    
  4. 再次调用 GetAdaptersInfo,将 pAdapterInfoulOutBufLen 作为参数传递并执行常规错误检查。 将其值返回到 DWORD 变量 dwRetVal (,以便) 进行更广泛的错误检查。

    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) {
        printf("GetAdaptersInfo call failed with %d\n", dwRetVal);
    }
    
    
    
  5. 如果调用成功,请访问 pAdapterInfo 结构中的某些数据。

    PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
    while (pAdapter) {
        printf("Adapter Name: %s\n", pAdapter->AdapterName);
        printf("Adapter Desc: %s\n", pAdapter->Description);
        printf("\tAdapter Addr: \t");
        for (UINT i = 0; i < pAdapter->AddressLength; i++) {
            if (i == (pAdapter->AddressLength - 1))
                printf("%.2X\n",(int)pAdapter->Address[i]);
            else
                printf("%.2X-",(int)pAdapter->Address[i]);
        }
        printf("IP Address: %s\n", pAdapter->IpAddressList.IpAddress.String);
        printf("IP Mask: %s\n", pAdapter->IpAddressList.IpMask.String);
        printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
        printf("\t***\n");
        if (pAdapter->DhcpEnabled) {
            printf("\tDHCP Enabled: Yes\n");
            printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String);
        }
        else
          printf("\tDHCP Enabled: No\n");
    
      pAdapter = pAdapter->Next;
    }
    
    
  6. 释放为 pAdapterInfo 结构分配的任何内存。

    if (pAdapterInfo)
            free(pAdapterInfo);
    
    

下一步: 使用 GetInterfaceInfo 管理接口

上一步: 使用 GetNetworkParams 检索信息