- •Лабораторная работа №1
- •1.1. Цель и содержание работы
- •1.2. Основные конструкции языка c
- •Int X; // Переменная типа int
- •Int list[20]; // Массив целых величин
- •If (условие) оператор1 else оператор2
- •1.3. Функции ввода-вывода языка с
- •1.4. Создание консольного приложения
- •1.5. Меню интегрированной среды
- •1.6. Компиляция, отладка и запуск программы
- •1.7. Упражнения
- •Лабораторная работа №2
- •2.1. Цель и содержание работы
- •2.2. Использование функций библиотеки ipHlpApi
- •2.3. Упражнения
- •Int iErr; // Код ошибки
- •Лабораторная работа №3
- •3.1. Цель и содержание работы
- •3.2. Библиотека функций Winsock2
- •3.3. Структуры данных для работы с сокетами
- •3.4. Приложение-сервер
- •3.5. Приложение-клиент
- •3.6. Упражнения
- •Лабораторная работа №4
- •4.1. Цель и содержание работы
- •4.2. Функции для работы по протоколу udp
- •4.3. Приложение-сервер
- •4.4. Приложение-клиент
- •4.5. Упражнения
- •Лабораторная работа №5
- •5.1. Цель и содержание работы
- •5.2. Сканирование портов
- •5.3. Функции для определения состояния портов
- •5.4. Упражнения
- •Лабораторная работа №6
- •6.1. Цель и содержание работы
- •6.2. Сниффер
- •6.3. Упражнения
- •Библиографический список
1.6. Компиляция, отладка и запуск программы
Для того, чтобы скомпилировать набранную программу, нужно выбрать в меню Build пункт Build Solution.
Если программа содержит синтаксические ошибки, в процессе построения проекта они автоматически отображаются в окне Output. Каждое сообщение начинается с имени файла и номера строки, в которой обнаружена ошибка, а далее следует описание ошибки. Если дважды щелкнуть на строке с сообщением об ошибке, то среда переключится в окно редактирования и укажет на ошибочный фрагмент программы.
Если в программе нет синтаксических ошибок, ее можно запустить на выполнение в отладочном режиме, нажав клавишу F5 (можно также выбрать в меню Debug пункт Start Debugging).
Скомпилируйте набранную ранее программу. Если при наборе программы были допущены синтаксические ошибки – устраните их. Сохраните текст программы в файле с помощью команды Save, а затем запустите программу. На экране должно открыться окно консоли, в котором будет напечатан текст «Hello!». Для завершения работы программы нажмите клавишу Enter.
Для завершения работы с проектом просто закройте окно интегрированной среды.
1.7. Упражнения
Каждое упражнение должно быть оформлено в виде отдельной программы – консольного приложения Windows.
Задание:
Ввести строку текста (используя функцию gets), заменить все пробелы в строке на символы подчеркивания (используя цикл while) и вывести результат (используя функцию puts).
N факториал (N!) – это произведение натуральных чисел от 1 до N. Ввести N, вычислить N! (используя цикл for) и вывести результат.
Ввести целые числа k и n. Вычислить значение kn (используя цикл for) и вывести результат.
Ввести целое число N. Найти все делители числа методом простого перебора. Если число N простое, выдать соответствующее сообщение.
Ввести целое число k. Построить и вывести на экран последовательность Фибоначчи из k членов. Первый и второй члены последовательности равны 1, каждый следующий равен сумме двух предыдущих (1, 1, 2, 3, 5, 8, 13, …).
Ввести целое число a. Используя символ *, вывести на экран ромб шириной и высотой 2a+1 символов:
*
* *
* *
* *
*
Лабораторная работа №2
2.1. Цель и содержание работы
Целью данной работы является изучение правил использования функций библиотеки IPHlpApi, предназначенных для получения информации о сетевых параметрах конечного узла.
Отчет о лабораторной работе не оформляется. Прием задания производится непосредственно на компьютере по предъявлению работающей, полностью отлаженной программы.
2.2. Использование функций библиотеки ipHlpApi
Для работы с параметрами сети используется библиотека IPHlpApi.lib. Общую информацию о сети можно получить с помощью функции DWORD GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen), которая имеет два параметра – указатель на структуру FIXED_INFO и указатель на размер этой структуры. Если первый параметр оставить нулевым, а в качестве второго задать указатель на числовую переменную, то в эту переменную запишется размер памяти, необходимый для структуры FIXED_INFO. Эта операция должна выполняться при первом вызове функции, память надо выделять с помощью функции GlobalAlloc.
После этого функция GetNetworkParams вызывается еще раз, но с указанием двух параметров. Если результатом выполнения функции будет 0, то получение данных прошло успешно. В результате работы функции будет получен указатель на структуру FIXED_INFO:
typedef struct { char HostName[MAX_HOSTNAME_LEN + 4]; char DomainName[MAX_DOMAIN_NAME_LEN + 4]; PIP_ADDR_STRING CurrentDnsServer; IP_ADDR_STRING DnsServerList; UINT NodeType; char ScopeId[MAX_SCOPE_ID_LEN + 4]; UINT EnableRouting; UINT EnableProxy; UINT EnableDns;
} FIXED_INFO;
В программе мы будем использовать следующие параметры структуры FIXED_INFO:
HostName – имя компьютера;
DnsServerList.IpAddress – список IP-адресов серверов DNS;
NodeType – тип сетевого устройства;
EnableRouting – если равно TRUE, то маршрутизация включена;
EnаblеРrоху – если равно TRUE, то кэширование включено.
На компьютере может быть несколько сетевых устройств. Получив общую информацию, можно приступить к перечислению параметров всех установленных адаптеров. Для этого используется функция
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen). У функции имеется два параметра: указатель на структуру IP_ADAPTER_INFO и указатель на размер этой структуры. Если первый параметр оставить нулевым, а в качестве второго задать указатель на числовую переменную, то в эту переменную после вызова функции будет записан объем памяти, необходимый для сохранения структуры.
Структура IP_ADAPTER_INFO определена следующим образом:
typedef struct _IP_ADAPTER_INFO { struct _IP_ADAPTER_INFO* Next; DWORD ComboIndex; char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; UINT AddressLength; BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; DWORD Index; UINT Type; UINT DhcpEnabled; PIP_ADDR_STRING CurrentIpAddress; IP_ADDR_STRING IpAddressList; IP_ADDR_STRING GatewayList; IP_ADDR_STRING DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t LeaseExpires;
} IP_ADAPTER_INFO;
Мы будем использовать следующие параметры:
Tуре – тип адаптера. Может принимать одно из следующих значений:
MIB_IF_TYPE_ETHERNET – адаптер Ethernet;
MIB_IF_TYPE_TOKENRING – адаптер Token Ring;
MIB_IF_TYPE_FDDI – адаптер FDDI;
MIB_IF_TYPE_PPP – РРР-адаптер;
MIB_IF_TYPE_LOOPBACK – адаптер LoopBack;
MIB_IF_TYPE_SLIP – Slip-адаптер;
MIB_IF_TYPE_OTHER – другое;
AdapterName – имя адаптера;
Description – название фирмы-производителя;
AddressLength – длина МАС-адреса;
Address – МАС-адрес;
DhcpEnabled – принимает значение TRUE, если включен DHCP;
IpAddressList – список IP-адресов и масок сети;
GatewayList – список шлюзов;
DhcpServer – адреса DHCP -серверов.