Управление интерфейсами с помощью 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 с общей проверкой ошибок и верните его значение в переменную
dwRetVal
DWORD (для более расширенной проверки ошибок).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 в первой строке обозначает широкую строку. Используется, так как атрибут Nameструктуры
Adapter
IP_ADAPTER_INDEX_MAP является WCHAR, который является строкой Юникода.Освободите любую память, выделенную для структуры pInfo .
if (pInterfaceInfo) { free(pInterfaceInfo); pInterfaceInfo = NULL; }
Следующий шаг. Управление IP-адресами с помощью GetIpAddrTable
Предыдущий шаг. Управление сетевыми адаптерами с помощью GetAdaptersInfo