Skip to content
This repository was archived by the owner on Sep 9, 2021. It is now read-only.

Conversation

BigAwesomeTurtle
Copy link

Инструкция по сборке/установке и использованию

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

Запуск клиента:
python3 calc_client.py [IP] [Port]
При запуске клиента, если всё прошло успешно, выводится приветственное сообщение, Usage, и появляется возможность пользоваться калькулятором:
image

Описание используемого протокола

Имеется два типа пакетов: отправляемые от клиентов серверу и от сервера клиентам.

У пакетов, отправляемых от клиентов серверу, имеется два подтипа: для запроса быстрой операции и для запроса медленной операции.

Формат пакета для запроса быстрой операции:

      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID              |T |  OP |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |					            |
    +              ARGUMENT_1 (32 bit)              +
    |                    	                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |			                            |
    +              ARGUMENT_2 (32 bit)              +
    |                    	                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    

ID - идентификатор запроса
T - тип операции (0 - быстрая операция, 1 - долгая операция)
OP - код операции (0 - сложение, 1 - вычитание, 2 - умножение, 3 - деление)

За id и флагами следую два 32-битных float аргумента, содержащих операнды

Формат пакета для запроса медленной операции:

      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID              |T |  OP |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |						    |
    +              ARGUMENT   (32 bit)              +
    |                    	                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |	                   TIME                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Поле T в данном случае равно 1, а в OP имеет место следующая кодировка: 0 - факториал, 1 - корень.

В качестве id при запросе клиент указывает 0. Сервер получает запрос с нулевым id, рандомит уникальный id для этого запроса и отдаёт клиенту, тот запоминает и затем обращается за результатом по этому id.

Далее следует 32-битный целый аргумент в случае факториала и 32-битный float аргумент в случае корня.

В поле TIME указывается время в миллисекундах, по истечению которого сервер перестанет пытаться посчитать долгую операцию и вернёт клиенту timeout error.

Формат пакетов, отправляемых от сервера клиентам:

     0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID              |  RCODE |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |						    |
    +			   		            +
    |                    	                    |
    +                RESULT (64 bit)                +
    |						    |
    +			  		            +
    |                    	                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 

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:
image

Клиент Windows_2:
image

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants