Управление сетевыми адаптерами с помощью GetAdaptersInfo
Функция GetAdaptersInfo заполняет указатель на структуру IP_ADAPTER_INFO со сведениями о сетевых адаптерах, связанных с системой.
Как использовать GetAdaptersInfo
Объявите указатель на переменную IP_ADAPTER_INFO с именем pAdapterInfo, а также переменную ULONG с именем ulOutBufLen. Эти переменные передаются в качестве параметров функции GetAdaptersInfo. Кроме того, создайте переменную DWORD DWORD с именем dwRetVal (для проверки ошибок).
IP_ADAPTER_INFO *pAdapterInfo; ULONG ulOutBufLen; DWORD dwRetVal;
Выделите память для структур.
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ); ulOutBufLen = sizeof(IP_ADAPTER_INFO);
Сделайте первоначальный вызов GetAdaptersInfo, чтобы определить размер, необходимый для переменной ulOutBufLen.
Заметка
Этот вызов функции намеренно вызывает сбой и используется для того, чтобы обеспечить, что переменная ulOutBufLen указывает размер, достаточный для того, чтобы вместить всю информацию, возвращенную pAdapterInfo. Это общая модель программирования для структур данных и функций этого типа.
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) { free (pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen ); }
Выполните второй вызов GetAdaptersInfo, передав pAdapterInfo и ulOutBufLen в качестве параметров и выполняя стандартную проверку ошибок. Верните его значение в переменную DWORDdwRetVal (для более тщательной проверки ошибок).
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) { printf("GetAdaptersInfo call failed with %d\n", dwRetVal); }
Если вызов произведен успешно, получите доступ к некоторым данным в структуре 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; }
Освобождает любую память, выделенную для структуры pAdapterInfo.
if (pAdapterInfo) free(pAdapterInfo);
Следующий шаг: управление интерфейсами с помощью GetInterfaceInfo
Предыдущий шаг: Получение сведений с помощью GetNetworkParams