Дипломная работа: Программа установки защищенных сетевых соединений с использованием протокола ISAKMP

Однако использование нитей несет в себе несколько опасностей, и главная из них это работа с общей памятью. Рассмотрим конкретный пример. Оператор увеличения переменной на единицу для программы выливается в 3 действия:

1. Загрузить значение переменной в регистр

2. Увеличить регистр

3. Записать значение регистра в переменную

Если две нити начнут выполнять этот оператор одновременно, то может произойти следующая последовательность действий:

Нить 1 Нить 2

1 Загрузить значение переменной в регистр

1 Загрузить значение переменной в регистр

2 Увеличить регистр

3 Записать значение регистра в переменную

2 Увеличить регистр

3 Записать значение регистра в переменную

В этом случае нить 1 перезапишет значение записанной нитью 2, и переменная увеличится лишь на единицу вместо двух. Такие места в коде называют критическими секциями и организуют работу так, что они гарантировано выполняются только одной нитью.

Использование многонитевого принципа построения моей программы вызвано двумя причинами:

· Необходимость постоянно прослушивать требуемый порт на наличие пришедшего пакета.

· Принцип действия программы похож на принцип работы серверного приложения (в качестве запросов клиентов выступают приходящие пакеты). В связи с этим становиться очень ценным возможность обработки пакетов согласно их важности.

Механизм обмена информации между нитями

В процессе работы программы нитями необходимо обмениваться информацией. В основном это передача пакетов и запросов с параметрами. Для осуществления обмена использовался механизм pipe [8]. Pipe представляет собой модуль для передачи данных. Единственным его ограничением является то, что этот модуль создает однонаправленный поток данных. Создание производится с помощью функции pipe .

#include <unistd.h>

intpipe (intfiledes[2]);

Функция возвращает 0 в случае успеха и –1 при ошибке. Параметрами в функцию предается массив из двух дескрипторов, которые заполняются внутри функции. В первый дескриптор (filedes[0]) предназначен для чтения из pipe, а второй (filedes[1]) для записи в pipe. Чтение из pipe и запись в него производятся с помощью стандартных функций read и write . Для этих функций дескриптор pipe ничем не отличается от дескриптора файла.

#include <unistd.h>

ssize_t read (int fildes, void *buf, size_t nbyte);

ssize_t read (int fildes, void *buf, size_t nbyte);

Вторым параметром в функции передается указатель на буфер, куда записывать данные (для read ) или откуда считывать их (для write ). Третьим параметром для read передается максимальное число читаемых данных, я для write число записываемых байт.

Выбор pipe в качестве средства передачи между нитями обусловлен простотой и наглядностью данного метода. Плюс корректно обрабатывают ситуацию, когда в pipeпишут сразу 2 сообщения – эти сообщения не перемешиваются, а записываются последовательно. Правда в этом случае встает задача разделения этих двух сообщений, т. к. read не разделяет их, а, прочитав сразу два можно или не заметить второе сообщение или посчитать неверной структуру первого. Для избежания этого формат сообщения, передаваемого в pipe в моей программе следующий.


Рис. 8. Структура передаваемых запросов

Первым байтом в сообщении идет тип данного сообщения, который говорит, какие именно данные содержаться. Если тип сообщения не предусмотрен в месте, куда это сообщение пришло, сообщается об ошибке и из pipe считывается буфер максимальной длины. Следующие за типом сообщения 4 байта содержат длину передаваемых данных. Если тип сообщения налагает какие-либо ограничения на длину данных (например, если передается IP адрес, то его длина должна быть 4 байта) и считанная длина этим ограничениям не удовлетворяет, то также сообщается об ошибке, и стараемся все вычитать из pipe. После этого из pipe достаются данные указанной длины. После обработки считанного запроса процедура повторяется заново, начиная с получения типа сообщения. Такой формат сообщения и приведенный порядок его обработки гарантирует, что никакое сообщение не будет потеряно.

Нитевая структура программы

В этом разделе будет рассмотрено, из каких нитей состоит программа, их назначение и как они взаимодействуют друг с другом. На рисунке 9 представлена нитевая структура программа.


???. 9. ??????? ????????? ?????????

К-во Просмотров: 167
Бесплатно скачать Дипломная работа: Программа установки защищенных сетевых соединений с использованием протокола ISAKMP