This repository was archived by the owner on Sep 9, 2021. It is now read-only.
Иванов Илья, 3530901/70203, lab3c #51
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Инструкция по сборке/установке и использованию
Калькулятор реализован на языке python, сборка не требуется.

Запуск сервера:
python3 calc_server.py (используется порт 1234)
При запуске сервера, если всё прошло успешно, он начинает слушать подключения к порту 1234, о чём сообщает в терминале:
Запуск клиента:

python3 calc_client.py [IP] [Port]
При запуске клиента, если всё прошло успешно, выводится приветственное сообщение, Usage, и появляется возможность пользоваться калькулятором:
Описание используемого протокола
Имеется два типа пакетов: отправляемые от клиентов серверу и от сервера клиентам.
У пакетов, отправляемых от клиентов серверу, имеется два подтипа: для запроса быстрой операции и для запроса медленной операции.
Формат пакета для запроса быстрой операции:
ID - идентификатор запроса
T - тип операции (0 - быстрая операция, 1 - долгая операция)
OP - код операции (0 - сложение, 1 - вычитание, 2 - умножение, 3 - деление)
За id и флагами следую два 32-битных float аргумента, содержащих операнды
Формат пакета для запроса медленной операции:
Поле T в данном случае равно 1, а в OP имеет место следующая кодировка: 0 - факториал, 1 - корень.
В качестве id при запросе клиент указывает 0. Сервер получает запрос с нулевым id, рандомит уникальный id для этого запроса и отдаёт клиенту, тот запоминает и затем обращается за результатом по этому id.
Далее следует 32-битный целый аргумент в случае факториала и 32-битный float аргумент в случае корня.
В поле TIME указывается время в миллисекундах, по истечению которого сервер перестанет пытаться посчитать долгую операцию и вернёт клиенту timeout error.
Формат пакетов, отправляемых от сервера клиентам:
ID - идентификатор запроса.
RCODE - результат запроса
Для RCODE применяется следующая кодировка:
RCODE = 0 – запрос прошёл успешно, результат готов и содержится в следующих 64 битах
RCODE = 1 – timeout error
RCODE = 2 – math error
RCODE = 3 – с этим RCODE-ом приходит пакет от сервера, когда он выдаёт пользователю ID запроса
RCODE = 4 – Запрошенный результат всё ещё считается
RCODE = 5 – Ошибка, операции с запрошенным id нет на сервере
RCODE = 6-7 – зарезервировано
После ID и RCODE следует 64-битное поле результата, содержащее для всех операций, кроме факториала, результат в формате double, а для факториала результат в формате 32-битного целого числа res1, за которым следует ещё одно 32-битное целое число res2, а сам факториал подсчитывается по формуле res1 * 10^(res2)
Пример работы
Клиент 1:

Клиент Windows_2:

log-сообщения на сервере:
