Поделиться через


Управление интерфейсами с помощью GetInterfaceInfo

Функция GetInterfaceInfo заполняет указатель на структуру IP_INTERFACE_INFO сведениями об интерфейсах, связанных с системой.

Использование GetInterfaceInfo

  1. Объявите указатель на объект IP_INTERFACE_INFO с именем pInfoи объект ULONG с именем ulOutBufLen. Также объявите объект DWORD с именем dwRetVal (используется для проверки ошибок).

        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 с общей проверкой ошибок и верните его значение в переменную dwRetValDWORD (для более расширенной проверки ошибок).

        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 в первой строке обозначает широкую строку. Используется, так как атрибут NameструктурыAdapter IP_ADAPTER_INDEX_MAP является WCHAR, который является строкой Юникода.

     

  6. Освободите любую память, выделенную для структуры pInfo .

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

Следующий шаг. Управление IP-адресами с помощью GetIpAddrTable

Предыдущий шаг. Управление сетевыми адаптерами с помощью GetAdaptersInfo