Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кулаков В.Г. Методические указания к лабораторн...doc
Скачиваний:
5
Добавлен:
04.05.2019
Размер:
286.72 Кб
Скачать

2.3. Упражнения

Требуется создать новое консольное приложение, а затем ввести, скомпилировать и запустить программу, приведенную в листинге 2.1.

Листинг 2.1. Программа для просмотра данных сетевых адаптеров

#include "stdafx.h"

#include <windows.h>

#include <iphlpapi.h>

int main(int argc, _TCHAR* argv[])

{

PFIXED_INFO pFixedInfo;

ULONG iFixedInfo;

PIP_ADAPTER_INFO pAdapterInfo, pAdapter;

ULONG iAdapterInfo;

PIP_ADDR_STRING chAddr;

Int iErr; // Код ошибки

// Определить объем памяти, необходимой для хранения

// структуры FIXED_INFO

iErr = GetNetworkParams(NULL, &iFixedInfo);

if ((iErr!= 0) && (iErr != ERROR_BUFFER_OVERFLOW))

{

printf("GetNetworkParams failed\n");

getchar(); return -1;

}

// Выделить память

if ((pFixedInfo=

(PFIXED_INFO)GlobalAlloc(GPTR, iFixedInfo))==NULL)

{

printf("Memory allocation error\n");

getchar(); return -2;

}

// Записать данные в выделенную область памяти

if (GetNetworkParams(pFixedInfo, &iFixedInfo) != 0)

{

printf("GetNetworkParams failed\n");

getchar(); return -3;

}

printf("IPRouting: %s\n",pFixedInfo->EnableRouting ?

"Enabled" : "Disabled");

printf("WinsProxy: %s\n",pFixedInfo->EnableProxy ?

"Enabled" : "Disabled");

// Определить объем памяти, необходимой для хранения

// структуры IP_ADAPTER_INFO

iAdapterInfo = 0;

iErr=GetAdaptersInfo(NULL, &iAdapterInfo);

if ((iErr!= 0) && (iErr != ERROR_BUFFER_OVERFLOW))

{

printf("GetAdaptersInfo failed\n");

getchar(); return -4;

}

// Выделить память

if ((pAdapterInfo = (PIP_ADAPTER_INFO)

GlobalAlloc(GPTR,iAdapterInfo)) == NULL)

{

printf("Memory allocation error\n");

getchar(); return -5;

}

// Записать данные в выделенную область памяти

if (GetAdaptersInfo(pAdapterInfo, &iAdapterInfo) != 0)

{

printf("GetAdaptersInfo failed\n");

getchar(); return -6;

}

pAdapter = pAdapterInfo;

printf("===========================\n");

// Обработка списка адаптеров

while (pAdapter)

{

// Определить тип адаптера

switch (pAdapter->Type)

{

case MIB_IF_TYPE_ETHERNET:

printf("Ethernet adapter: \n"); break;

case MIB_IF_TYPE_PPP:

printf("PPP adapter: \n"); break;

case MIB_IF_TYPE_LOOPBACK:

printf("Loopback adapter: \n"); break;

case MIB_IF_TYPE_TOKENRING:

printf("Token Ring adapter: \n"); break;

case MIB_IF_TYPE_FDDI:

printf("FDDI adapter: \n"); break;

case MIB_IF_TYPE_SLIP:

printf("Slip adapter: \n"); break;

case MIB_IF_TYPE_OTHER:

default: printf("Other adapter: \n");

}

// Вывести назваание адаптера

printf("%s\n",pAdapter->AdapterName);

// Вывести описание адаптера

printf("Description: %s\n",pAdapter->Description);

// Вывести MAC-адрес побайтно в шестнадцатеричном коде

printf("Physical Address: ");

for (UINT i=0; i<pAdapter->AddressLength; i++)

printf("%.2X",(int)pAdapter->Address[i]);

printf("\n");

// Проверить, резрешено ли использование DHCP

printf("DHCP Enabled: %s\n",

(pAdapter->DhcpEnabled ? "yes" : "no"));

// Вывести все IP-адреса и маски адаптера

chAddr = &(pAdapter->IpAddressList);

while(chAddr)

{

printf("IP Address: %s\n",chAddr->IpAddress.String);

printf("Subnet Mask: %s\n",chAddr->IpMask.String);

chAddr = chAddr->Next;

}

// Вывести шлюз по умолчанию

printf("Default Gateway: %s\n",

pAdapter->GatewayList.IpAddress.String);

// Вывести имя DHCP-сервера

printf("DHCP Server: %s\n",

pAdapter->DhcpServer.IpAddress.String);

printf("===========================\n");

pAdapter = pAdapter->Next;

getchar();

}

return 0;

}

Для компиляции примера необходимо открыть свойства проекта и в разделе Linker/Input добавить библиотеку IPHlpApi.lib в свойство Additional Dependencies.

Для каждого установленного на компьютере сетевого адаптера программа выводит полученные значения параметров, а затем ожидает нажатия любой клавиши на клавиатуре.