Саркисян Вероника, 143.
Целью данного проекта была реализация утилиты rsync, синхронизирующей множество файлов между двумя серверами. http://wiki.cs.hse.ru/%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:rsync
К моменту написания данного отчета мною была написана утилита, выводящая список команд (cp - копировать файл, rm - удалить файл), необходимых для синхронизации двух директорий на разных серверах. Кроме того, в ходе работы над проектом я научилась пользоваться отладчиком gdb и утилитой CMake.
Запущенные на разных серверах, утилиты обмениваются данными через сокеты следующим образом: клиент посылает запрос на список файлов (RequestFiles), сервер получив запрос получает список файлов директории (GetFiles) отправляет его клиенту (SendFileList), тот вычисляет разницу (difference) и выводит команды (cp и rm) на стандартный поток вывода. Для завершения работы клиент отправляет серверу сообщение об успешном завершении (SendOk). За синхронизацию работы сервера и клиента отвечают методы класса Protocol и отнаследованные от него классы Sender и Receiver, за соединение - класс SocketConnection. Сокеты, разумеется, использованы сетевые, но для отладки они запетлены на один и тот же сервер. Данные между сокетами обмениваются в виде фреймов, сериализованных с помощью библиотеки boost::serialization. В каждом фрейме содержится информаци о его длине (первые 4 байта), id сообщения (ОК/получить файлы/принять файлы), и body - сами данные. Подобная организация сообщения между серверами необходима для контроля за целостностью отправленных и полученных данных. Помимо это исполльзованы функции write_all и read_all, которые в отличие от стандратных системных вызовов read и write достоверно запишут весь фрейм. Для обработки исключений использован метод throw runtime_error(string s), вызываемый после каждого системного вызова.
Пример запуска: ./main server ./dir1 ./dir2 - запуск сервера ./main client ./dir1 ./dir2 - запуск клиента
где ./dir1 - путь к синхронизируемой папке клиента, ./dir2 - к папке сервера.