Skip to content

Latest commit

 

History

History
197 lines (185 loc) · 13.6 KB

lab.md

File metadata and controls

197 lines (185 loc) · 13.6 KB

Лаба №6. Удаленный вызов процедур с помощью XML-RPC

Файлы к лабе

  • О XML-RPC и список вариантов [(.doc)](XML-RPC методичка.doc?raw=true)

Быстрый старт

  • Список вариантов (.pdf)
  • Инструкция сборки ТЫК

Выполнение лабораторной работы

  • Требуется наличие Debian-подобной ОС (лучше всего две виртуальные машины в одной NAT-сети - прим. mxsleo)
  • Необходима установка сборочных библиотек и утилит
  • Необходимо установить файлы разработки XML-RPC C
  • Предоставлены готовые сервер и клиент (поиск суммы n чисел) для UNIX
  • Вы переписываете логику в соответствии с вариантом и собираете программы
  • Сначала запускается сервер, а затем клиент

Файлы шаблона:

  • Шаблон сервера (.c)
  • Шаблон клиента (.c)

Типы данных:

Имя типа

Пример тега

Описание типа

array

 <array>
   <data>
     <value><i4>1404</i4></value>
     <value><string>Что-нибудь здесь</string></value>
     <value><i4>1</i4></value>
   </data>
 </array>

Массив величин, без ключей

base64

<base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64>

Кодированные в Base64 двоичные данные

boolean

<boolean>1</boolean>

Логическая (булева) величина (0 или 1)

date/time

<dateTime.iso8601>19980717T14:08:55</dateTime.iso8601>

Дата и время

double

<double>-12.53</double>

Дробная величина двойной точности

integer

<i4>42</i4>

Целое число

string

<string>Здравствуй, Мир!</string>

Строка символов (в той же кодировке, что и весь XML-документ)

struct

 <struct>
   <member>
     <name>Что-то</name>
     <value><i4>1</i4></value>
   </member>
   <member>
     <name>Ещё что-то</name>
     <value><i4>2</i4></value>
   </member>
 </struct>

Массив величин, с ключами

nil

<nil/>

Нулевая (пустая) величина — это расширение XML-RPC

Инструкция и пример работы

Буду предполагать, что виртуальные машины уже установлены и настроены. В противном случае можно обратиться к одному из многочисленных гайдов в интернете или к предыдущим лабораторным работам. В моём случае в качестве клиента и сервера выступают виртуальные машины с установленной Xubuntu 22.04 LTS, объединённые в одну общую NAT-сеть. Дальнейшие действия будут производиться в соответствии с инструкцией в моём личном репозитории: https://github.com/mxsleo/xmlrpc-c_example.

Подготовка сборочной среды

Для начала установим на обе машины сборочные библиотеки и утилиты:

sudo apt install clang gcc git make libcurl4-openssl-dev libssl-dev

Затем скачаем и установим файлы разработки XML-RPC C, также на обе системы:

cd ~/
wget -c https://sourceforge.net/projects/xmlrpc-c/files/Xmlrpc-c%20Super%20Stable/1.54.05/xmlrpc-c-1.54.05.tgz
tar -xvf xmlrpc-c-1.54.05.tgz
cd xmlrpc-c-1.54.05
./configure
make
sudo make install
sudo ldconfig

На этапе загрузки архива исхов XML-RPC C (вторая команда) рекомендую проверить наличие в домашнем каталоге самого архива, в случае ошибки загрузку повторить. После установки можно удалить временные объекты:

rm -rf ~/xmlrpc-c-1.54.05.tgz ~/xmlrpc-c-1.54.05

Загрузка и сборка примеров

Как только мы подготовили обе машины, можно приступать к загрузке моих исходников сервера и клиента со сборочной системой на обе виртуалки:

cd ~/
git clone https://github.com/mxsleo/xmlrpc-c_example.git
cd xmlrpc-c_example

Затем нужно собрать программы. Если работа осуществляется на одном компьютере, то выполняем:

make

Иначе, на сервере запускаем:

make server

А на клиенте:

make client

В случае успеха, в каталоге ~/xmlrpc-c_example появятся две программы - unix_server и unix_client. Иначе система сообщит детали об ошибке прямо в терминале.

Запуск сервера и клиента

Теперь, когда сервер собран, его можно запустить:

./unix_server <port>

Например,

./unix_server 8080

Если работа осуществляется на одной машине, его можно запустить в фоновом режиме:

./unix_server <port> &

Чтобы вернуть его с фонового выполнения, можно использовать:

fg

Для остановки используется сочетание клавиш Ctrl+C. Клиент запустить ещё проще:

./unix_client <server ip> <port>

Например,

./unix_client 192.168.0.10 8080

Если клиент и сервер - это одна машина, используется команда:

./unix_client localhost 8080

В примере дано взаимодействие следующего вида: клиент запрашивает количество чисел, сами числа, посылает их на сервер и просит просуммировать. Сервер возвращает готовую сумму. Можно подробно рассмотреть запросы, воспользовавшись утилитой tcpdump:

sudo tcpdump -i any -A port 8080

Изменение логики программ

Вся логика сервера прописана в этих строках: описание функции и внесение её в реестр. Логика клиента прописана в этих строках: объявление имени метода и его вызов. Мы можем менять её как угодно, для этого достаточно понимать, что передавать надо данные в формате xmlrpc_value и функцию объявлять по образцу моего сервера. Подробнее про преобразование различных типов к xmlrpc_value и обратно можно почитать в документации: шифрование, дешифрование, литералы. Там же можно получить необходимую информацию о принципе работы программы и найти другие примеры. После изменения кода его необходимо пересобрать (если мы пишем код на хосте, то предварительно закинуть обновлённые файлы в ~/xmlrpc-c_example):

make clean
make

Если будут вопросы, пишите VK.