Управление интерфейсами с помощью GetInterfaceInfo
Функция GetInterfaceInfo заполняет указатель на структуру IP_INTERFACE_INFO со сведениями об интерфейсах, связанных с системой.
Чтобы использовать GetInterfaceInfo
Объявите указатель на объект IP_INTERFACE_INFO с именем
pInfo
и объект ULONG с именемulOutBufLen
. Кроме того, объявите объект DWORD с именемdwRetVal
(используется для проверки ошибок).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 в первой строке обозначает широкую строку. Это используется, так как атрибут имени
Adapter
структуры IP_ADAPTER_INDEX_MAP является WCHAR, которая является строкой Юникода.Освобождает любую память, выделенную для структуры pInfo.
if (pInterfaceInfo) { free(pInterfaceInfo); pInterfaceInfo = NULL; }
Следующий шаг: управление IP-адресами с помощью getIpAddrTable
Предыдущий шаг: управление сетевыми адаптерами с помощью GetAdaptersInfo