Информационная безопасность
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
IsTransactionMode(void) (узнать, выставлен ли флаг режима транзакции)
bool IsUpdateMode(void) (узнать, выставлен ли флаг режима обновления)
. Структура USER:
Представляет описание структуры - описателя файла-письма. Содержит поля:
char name [ADDRESS_MAX_LENGTH] (имя почтового ящика)
char domain [ADDRESS_MAX_LENGTH] (имя почтового домена)password [ADDRESS_MAX_LENGTH] (пароль на почтовый ящик) lock (флаг, определяющий, заперт ли почтовый ящик)
. Класс CONF:
Представляет описание абстрактного объекта, описывающего всю конфигурацию POP3-сервера. Содержит поля:
fstream conf_file (из этого файла при запуске программы считываем настройки POP3-сервера)
char ip_address[32] (ip-адрес этого сервера)
int port (порт, на который будем принимать POP3-запросы (обычно 110)
int echo (выводить ли на экран каждую POP3-транзакцию)
char Path [MAX_PATH] (путь к исполняемому файлу сервера)
char Domain [ADDRESS_MAX_LENGTH] (домен сервера (напр. mailserver1.com)_REF file [MAX_USERS] (массив описателей для файлов - писем)f_index (его индекс)highest_number_accessed (непонятная хрень, смотрите RFC 1225) c_mes (номер обрабатываемого файла-письма для соответствующих команд)
int total_size (суммарный размер файлов-писем в почтовом ящике)
CONF(void) (конструктор, обнуляющий все поля)
void Init(void) (считать настройки сервера из файла conf.inf)
void ProcessConfigCommands(void) (обработать команды настройки сервера)
int ParseMailDrop (char* user) (Название функции навеяно RFC 1225. Функция просматривает почтовый ящик, идентифицирует отдельные
файлы-письма, определяет размер каждого и общий их размер.)
// 7 функций для работы с пользователями
// кстати, пользователь - это папка с файлом password.inf
bool IsUserExistent (char* User) (Проверяем, существует ли такой пользователь)
int DeleteUser(void) (Удалить пользователя)
int AddUser(void) (Создать пользователя)
void Help(void) (Вывести на экран информацию о конфигурационных командах)
int ListUsers(void) (Вывести список пользователей)
char* GetPassword (char* user, char* password) (узнать текущий пароль) SetPassword(void) (установить новый пароль)
. Класс DISPATCH_SERVER_SOCKET:
Представляет описание диспетчерского сокета POP3-сервера. Содержит поля:
long connection_time (время подключения)
struct sockaddr_in server_address, client_address (адресная структура сервера и клиента) retval, size_of_client_address (количество полученных байт, размер клиентской адресной структуры)
WSADATA wsaData (структура для загрузки библиотеки сокетов)
SOCKET dispatch_server_socket, msg_server_socket (диспетчерский сокет POP3-сервера, виртуальный сокет для каждого POP3-подключения)
DWORD dwThreadID (идентификатор новой нити)
DISPATCH_SERVER_SOCKET (CONF& conf) (конструктор диспетчерского сокета, принимает конфигурационный объект)
CONF conf (конструктор конфигурационного объекта, обнуляет все поля)
int accept_connect(void) (принимает входящие подключения)
. Класс SERVER_SOCKET:
Представляет описание виртуального сокета POP3-сервера (создаваемого для каждого подключения POP3-сервера и закрываемого при завершении подключения). Содержит поля:
char Buffer [SIZE_OF_BUFFER] (буфер для приёма / отправки почтовых транзакций)
SOCKET msg_server_socket (конструктор, инициализирующий поля)
int query (флаг, который разрешает / запрещает ответ на запрос)
int quit (флаг, который показывает, что сеанс почтовой связи окончен)
CONF conf (конструктор, инициализирующий поля)
long connection_time (время подлючения) report_file (в этот файл запишем всё, что сервер получает и отправляет)
USER user (почтовый ящик, из которого мы забираем почту за одно подключение. Для обращения к каждому почтовому ящику клиент всегда создаёт новое подключение, даже если эти ящики находятся на одном сервере)
char forward_path [ADDRESS_MAX_LENGTH] (здесь не используется. Но могла бы (см. RFC-1225)
char reverse_path [ADDRESS_MAX_LENGTH] (здесь не используется. Но могла бы (см. RFC-1225)
fstream mes_file (сюда записываем сообщение, пришедшее серверу за 1 почтовую транзакцию с клиентом. Может фактически содержать в себе несколько e-mailов)
char mes_path [MAX_PATH] (уникальное имя файла - сообщения)
MODE mode (конструктор, инициализирующий поля)
int not_this_command (счётчик нераспознавания принятой команды)
SERVER_SOCKET(void) (конструктор, инициализирующий поля)
int recv_data(void) (получить информацию через сокет)
int send_data(void) (отправить информацию через сокет)
int shutdown_and_closesocket(void) (мягко выключить сокет и закрыть его)
void erase_buffer(void) (стереть буфер) set_buffer (char*) (установить значение в буфере)
int ReplyOnClientConnection(void) (послать ответ клиенту на его подключение)
int ProcessClientQuery(void) (обработать запрос клиента)
SERVER_SOCKET& operator=(SERVER_SOCKET& right) (перегруженное присваивание из-за строк)
Модуль Server.cpp cодержит следующие элементы:
Описания функций:
DISPATCH_SERVER_SOCKET:DISPATCH_SERVER_SOCKET (CONF& conf_ref) - Инициализируем библиотеку WS2_32.DLL, Создаём базовый(диспетчерский) сокет сервера, настроенный на TCP, Записываем в адресную структуру IP адрес сервера и порт сервера, Связываем адрес сервера с базовым(диспетчерским) сокетом сервера, Переводим базовый(диспетчерский) сокет сервера на режим прослушивание / диспетчеризация сигналов на подключение и устанавливаем размер очереди одновременных обращений к серверу.
int DISPATCH_SERVER_SOCKET:accept_connect(void) - Ждём очередное подключение к серверу (функцией connect()) клиента и,
дождавшись, возвращаем виртуальный сокет сервера - для двухстороннего обмена сообщениями с данным клиентом. Выводим на экран время подключения клиента, его IP-адрес и порт. Для каждого подключившегося клиента создаём нить и передаём в неё адрес виртуального сокета сервера для двухстороннего обмена сообщениями с данным клиентом (нити нужны здесь для того, чтобы позволить серверу работать одновременно с несколькими клиентами).
SERVER_SOCKET:SERVER_SOCKET(void) - (конструктор, инициал?/p>