- •Лабораторная работа №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. Упражнения
- •Библиографический список
Лабораторная работа №3
3.1. Цель и содержание работы
Целью работы является изучение правил использования функций библиотеки Winsock2 при работе с сокетами по протоколу TCP.
Отчет о лабораторной работе не оформляется. Прием задания производится непосредственно на компьютере по предъявлению работающей, полностью отлаженной программы.
3.2. Библиотека функций Winsock2
Сокеты представляют собой высокоуровневый унифицированный интерфейс взаимодействия с телекоммуникационными протоколами. Библиотека Winsock2 поддерживает два вида сокетов – синхронные (блокируемые) и асинхронные (неблокируемые). Синхронные сокеты задерживают управление на время выполнения операции, а асинхронные возвращают его немедленно, продолжая выполнение в фоновом режиме, и, закончив работу, уведомляют об этом вызывающий код. Асинхронные сокеты программировать сложнее, чем синхронные, поэтому используются они редко.
Независимо от вида, сокеты делятся на два типа – потоковые и дейтаграммные. Потоковые сокеты работают с установкой соединения, обеспечивая надежную идентификацию обоих сторон и гарантируют целостность и успешность доставки данных. Дейтаграмные сокеты работают без установки соединения и не обеспечивают ни идентификации отправителя, ни контроля успешности доставки данных, зато они заметно быстрее потоковых.
Дейтаграммные сокеты опираются на протокол UDP, а потоковые – на TCP. Выбор типа сокетов определяется транспортным протоколом сервера – клиент не может установить с дейтаграммным сервером потоковое соединение.
Для работы с библиотекой Winsock2 необходимо открыть свойства проекта (Properties) и в разделе Linker/Input добавить библиотеку ws2_32.lib в свойство Additional Dependencies, а в исходный тест программы необходимо включить заголовочный файл winsock2.h.
3.3. Структуры данных для работы с сокетами
Устаревшая структура sockaddr была определена в библиотеке Winsock так:
struct sockaddr
{
u_short sa_family; // Семейство протоколов
char sa_data[14]; // IP-адрес узла и порт
};
В Winsock2 на смену ей пришла структура sockaddr_in, определенная следующим образом:
struct sockaddr_in
{
short sin_family; // Семейство протоколов
u_short sin_port; // Порт
struct in_addr sin_addr; // IP–адрес
char sin_zero[8]; // Хвост
};
Теперь адрес узла представлен в виде трех полей – номера порта, Iадреса узла и «хвоста» из восьми нулевых байт, который остался от символьного массива sa_data. Дело в том, что структура sockaddr не привязана к Интернету и может работать с другими сетями. Адреса же некоторых сетей требуют для своего представления гораздо больше четырех байт.
Структура in_addr определяется следующим в образом:
struct in_addr {
union {
struct {u_char s_b1,s_b2,s_b3,s_b4;} S_un_b;
struct {u_short s_w1,s_w2;} S_un_w;
u_long S_addr;
} S_un;
};
Таким образом, структура in_addr состоит из одного IP-адреса, записанного в трех различных форматах – в виде четырехбайтовой последовательности, пары двухбайтовых слов и одного длинного целого.
На практике можно пользоваться как sockaddr_in, так и устаревшей sockaddr. Однако прототипы остальных функций при переходе от Winsock к Winsock2 не изменились, и при использовании sockaddr_in приходится выполнять явные преобразования типов.
Узнать IP-адрес такого-то домена можно с помощью функции
struct hostent FAR* gethostbyname(const char FAR* name). Функция возвращает указатель на структуру hostent:
struct hostent
{
char FAR* h_name; // Официальное имя узла
char FAR* FAR* h_aliases; // Альтернативные имена узла
short h_addrtype; // Тип адреса
short h_length; // Длина адреса
char FAR* FAR* h_addr_list;// Список указателей на адреса
};
Для определения доменного имени по IP адресу используется функция struct hostent FAR* gethostbyaddr(const char FAR* addr, int len, int type). Первым аргументом функции является указатель на IP-адрес, второй аргумент задают длину (4 байта), а третий – тип адреса (AF_INET). В случае ошибки функции gethostbyname и gethostbyaddr возвращают пустой указатель.
Для преобразования IP-адреса, записанного в виде символьной последовательности наподобие "127.0.0.1" в четырехбайтовую числовую последовательность предназначена функция unsigned long inet_addr(const char FAR* cp). Она принимает указатель на символьную строку и преобразует ее в IP-адрес.
Для преобразования IP-адреса, записанного в сетевом формате в символьную строку, предусмотрена функция char FAR* inet_ntoa(struct in_addr), которая принимает на вход структуру in_addr, а возвращает указатель на строку.