Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
voland / Диплом.DOC
Скачиваний:
33
Добавлен:
16.04.2013
Размер:
791.55 Кб
Скачать

Создание нитей и организации передачи данных между ними.

Нить создается стандартной функцией pthread_create.

#include <pthread.h>

int pthread_create(pthread_t* thread_ID, const pthread_attr_t *attr,

void * (*start_func)(void *), void *arg);

Первый параметр в данной функции это некий дескриптор нити, с помощью которого создающий процесс (нить) может потом ею управлять. Третий параметр – имя функции, выполнением которой и займется новая нить. Как видно из описания функция имеет определенный формат. И последним параметром передается указатель на параметры, передаваемые этой нити при старте. В программе описано 5 функций для запуска нитей – работа с сетью, распределения пакетов, выполнения первой фазы, выполнения второй фазы (одна для New Group Modeи одна дляQuick Mode). Первые две нити создаются при старте программы, остальные по мере надобности. Рассмотрим пример создания нити для первой фазы.

#define THREAD_T pthread_t

#define THREAD_SIMPLE_CREATE(start_func, arg, tid) \

pthread_create(tid, NULL, start_func, arg)

THREAD_T tid;

……………………….

Record = AddCookieRecord(); /*Добавление в таблицу нитей первой фазы */

if( NULL == Record ) return ERROR_MEMORY;

MEMCPY(Record->CookieI, buff, 8);

Record->Ready = 0;

BUFptr = (BUFFER*)MALLOC( sizeof(BUFFER)); /* Создание параметра */

if( NULL == BUFptr ) return ERROR_MEMORY;

MEMINIT(BUFptr);

MEMADD(BUFptr, null, 1);

PUT_32BIT( addr_tmp, clientaddr.sin_addr.s_addr )/* Запись адреса партнера */

MEMADD(BUFptr, addr_tmp, 4);

PUT_16BIT( null, length );

MEMADD(BUFptr, null, 2);

MEMADD(BUFptr, buff, length); /* Запись длины пакета */

if (THREAD_SIMPLE_CREATE(WorkThread, (void*)BUFptr, &tid)) {

printf("Thread creation failed\n");

return 1;

}

……………………….

После принятия решения о том, что для принятого пакета нужно создавать отдельную нить я сначала добавляю новую запись в таблицу нитей первой фазы. В эту запись заноситься Cookie Initiatorи флагReady обнуляется как знак того, что первая фаза еще не закончена. После этого формируется массив, содержащий информацию необходимую для начала работы нити. В него входитIPадрес отославшего сообщение, длина пакета и собственно пакет. Указатель на виртуальный буфер, содержащий эту информацию, передается в качестве параметра в функцию нити. В самом начале работы каждая нить создаетpipe,для того чтобы ей можно было передавать пакеты. Читающий дескриптор она оставляет у себя, а дескриптор для записи она записывает в таблицу нитей первой фазы (запись она находит, зная значениеCookie Initiator). Туда же записывается и значениеCookie Responder,после того как оно будет определено. Для нитей второй фазы процесс создания во многом похож, за исключением того, что в качестве параметра передается указатель на структуруstate, которая содержит всю требуемую информацию (ключи шифрования, рабочие константы, адреса и т.п.). Процесс распределения дескрипторовpipeдля связи остается таким же. Дескриптор записи в нить работы с сетью является глобальной переменной и доступен каждой нити.

Тестирование проводилось путем создания простой модели программы. Простота заключается в отсутствии кода реализующего протокол. Нить просто принимает пакет, увеличивает внутренний счетчик и посылает ответ. При достижении счетчика определенного значения нити первой фазы начинают создавать нити второй фазы, а нити второй фазы, при том же значении счетчика заканчивают работу. Программа для данного тестирования явилась каркасом будущей программы, т.к. потом увеличение счетчика было заменено обработкой и анализом пакета. В данном тесте также проводилось тестирование и функций работы с памятью и функций работы с сетью.

Соседние файлы в папке voland