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


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

     

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

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

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

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