Информационные сети и коммуникации. Учебное пособие
.pdfВариант 2
Ожидать от клиента соединения. Вывести приглашение «>». Клиент передает на сервер текущее время в формате UNIX. Уведомить клиента о разнице в расхождении внутренних часов на компьютерах. Завершить соединение.
Вариант 3
Ожидать от клиента соединения. После начала обмена данными передать клиенту время системных часов в формате UNIX. Ожидать от клиента число, которое будет означать разницу в секундах между часами на компьютерах. Вывести разницу, завершить работу.
Вариант 4
Ожидать от клиента соединения. После начала обмена данными передать клиенту данные html страницы, считанной из файла, завершить соединение. Для успешного отображения информации в веббраузере необходимо сформировать пакет в формате HTTP/1.0.
Вариант 5
Ожидать от клиента соединения. После начала обмена данными передать клиенту данные текстового файла страницы, считанной из файла, завершить соединение. Для успешного отображения информации в веббраузере необходимо сформировать пакет в формате HTTP/1.0.
Вариант 6
Ожидать от клиента соединения. После начала обмена данными передать клиенту данные изображения, считанного из файла, завершить соединение. Для успешного отображения информации в веббраузере необходимо сформировать пакет в формате HTTP/1.0.
Вариант 7
Ожидать от клиента соединения. После начала обмена данными передать клиенту данные двоичного файла, завершить соединение. Для успешного отображения информации в веб-браузере необходимо в начале передачи данных отправить «Content-Type»-строку. Для двоичных данных
«Content-type»-строкабудетиметьвид «application/octet-stream».
Вариант 8
Ожидать от клиента соединения. Вывести приглашение с текущим временем «%d>». Клиент передает на сервер текущее время в формате UNIX. Уведомить клиента о разнице в расхождении внутренних часов на компьютерах. Завершить соединение.
41
Передайте на проверку преподавателю текст программы на языке Си и протоколы обмена данными клиент-сервер, сохраненные любым удобным способом.
Для выполнения практического задания потребуется произвольная версия операционной системы Линукс. Компиляцию программы следует производить при помощи компилятора gcc, который обычно входит в базовую поставку операционной системы. Компьютер преподавателя с установленной и запущенной на нем программой, размещенной в приложении, должен быть подключен к сети и находиться в пределах одного физического сегмента с компьютерами студентов.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1.В каком режиме должен находиться сокет-сервер, чтобы обеспечить широковещательную рассылку сообщений?
2.Какие ограничения установлены при широковещательной доставке данных?
3.Что произойдет, если сокет, находящийся в режиме сервера, будет некорректно закрыт?
42
6.РАЗРАБОТКА ПРИЛОЖЕНИЯ
СИСПОЛЬЗОВАНИЕМ РАСПРЕДЕЛЕННОЙ СИСТЕМЫ ОБМЕНА СООБЩЕНИЯМИ ZMQ
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Ранее вы приобрели базовые навыки разработки сокет-приложений, основанные на классических сокет-гнездах. Здесь вы получите представление о функциональных возможностях библиотеки распределения сообщений ZMQ.
Библиотека ZMQ – это библиотека обмена сообщениями (Messaging Queue, MQ), которая без особых усилий позволяет создавать сложные коммуникационные решения. В начале своего появления эта программная компонента разрабатывалась как интерфейс для обмена сообщениями (messaging middleware), затем – как легкий коммуникационный протокол, основанный на TCP-IP, а в настоящее время ZeroMQ позиционируется как новая компонента встеке сетевых протоколов.
Рассмотрим версию библиотеки zmq 4.X, как наиболее современную на настоящий момент.
В ZeroMQ предусмотрено несколько моделей обмена. Наиболее востребованными в настоящее время моделями обмена являются следующие.
REQUEST/REPLY – двусторонняя связь между программами-або- нентами распределенной MQ-системы: одна программа-клиент может взаимодействовать с одной или несколькими программами-серверами. Каждое отправленное сообщение предусматривает уведомление о доставке. Уведомление о доставке однозначно идентифицирует получателя сообщения. Этот тип взаимодействия программ в сети является типичным, например, так работают протоколы HTTP, POP, или IMAP, когда за запросом следует ответ. В ZeroMQ для такого обмена сообщениями клиентская программа использует сокет типа REQ. Серверная программа использует сокет REP. ZeroMQ позволяет через один сокет взаимодействовать с любым количеством парных программ.
PUBLISH SUBSCRIBE – публикует сообщение для множества подписчиков. От предыдущего метода отличается тем, что програм- ма-отправитель не получает уведомлений о получении сообщений
43
программами-подписчиками. В этом методе, однако, тоже имеется механизм регулирования: определяется некоторое пороговое количество сообщений, которое может оставаться в очереди не полученным подписчиком, и при попытке опубликовать очередное сообщение система сбрасывает попытку с соответствующим уведомлением отправителя.
Метод Publish subscribe стал популярным относительно недавно, его наиболее часто используют в механизмах рассылки сообщений, например, XMPP или webhooks. Рассылка и получение сообщения не связаны напрямую или, говоря по-другому, программа не имеет информации о получении данных абонентами подобно вещанию радиостанции. Таким образом, сообщение доходит только до слушателей, настроенных на текущую волну. В нашем случае это будут абоненты, подписавшиеся (subscribed) на сообщения такого типа. Важно отметить, что этот метод обмена сообщениями не связан с инфраструктурой: отправляемое на настроенный порт сообщение получат только те, кто предварительно подписался. Возможен также способ подписки на сообщения нескольких публикующих серверов.
UPSTREAM/DOWNSTREAM, или Pipeline, – этот метод использу-
ется для иерархической рассылки сообщений, DOWNSTREAM используется для рассылки вниз по иерархии, а UPSTREAM – наоборот. Программа-отправитель не получает уведомлений о доставке, и так же, как и в случае PUBLISH/SUBSCRIBE, имеется ограничение на количество неполученных сообщений.
PAIR – взаимодействие только между клиентом и сервером. Этот тип взаимодействия не предполагает маршрутизации сообщений и не содержит уведомлений о доставке.
Перед началом работы следует инициализировать ZMQ-контекст:
void *context;
context=zmq_init (2); if(context==NULL) exit(0); // создали контекст.
Затем необходимо создать сокет соответствующего типа (нас будет интересовать клиентский сокет – получатель подписки),
44
/socketzmq = zmq_socket (context, ZMQ_SUB);assert (socketzmq); // установили тип контекста - чтение данных - подписчик.
ret = zmq_connect (socketzmq,"tcp://127.0.0.1:5563" ); if (ret < 0) {perror("Error Zmq sock connect"); return 1;}; // подключились по сети
далее потребуется установить нужный режим подписки
ret = zmq_setsockopt (socketzmq, ZMQ_SUBSCRIBE, "EN", 2); // под-
писка на новости из сокет. Подписывается на сообщения, которые начинаются с символов EN. Прочие сообщения игнорируются.
assert (ret == 0);
int rc = zmq_msg_init (&msg); assert (rc == 0);
/* Block until a message is available to be received from socket */
rc = zmq_recv (socketzmq, &msg, 0);assert (rc == 0);
указатели на данные, и размер сообщения из пакета можно получить:
(void *)zmq_msg_data(&msg);
(void *)(size_t)zmq_msg_size(&msg);
В версии 4 библиотеки необходимость напрямую работать со структурой msg_t отпала, функция zmq_recv изменила свою семантику. Этот механизм «переехал» в функцию zmq_msq_recv().
Чтобы получить сообщение, теперь достаточно вызвать ее без предварительной подготовки структуры, передав ей сокет и буфер:
int zmq_msg_recv (zmq_msg_t *msg, void *socket, int flags); rc = zmq_recv (socketzmq, TCPINBUF,8192, 0);
Однако вопросы согласования и переполнения буфера теперь лежат на плечах программиста.
Необходимо разработать приложение, которое подпишется на канал рассылок сообщений, установленный на компьютере преподавателя. Приложение на компьютере преподавателя передает тематические
45
наборы сообщений: простой текст на английском языке, простой текст на русском языке, сжатый текст на английском языке. Для сжатия информации используется метод compress() библиотеки Zlib. Для распаковки сообщений потребуется применить метод uncompress(), обратный методу compress.
ret=uncompress(Umessage,&Ulen,message,(unsigned long) Clen))== Z_OK
Umessage – буфер для сообщения, где будет сохранен результат; Ulen – длина массива результата (до операции необходимо положить в эту переменную максимальный размер буфера, который нельзя
превышать при распаковке); message – сжатые данные;
Clen – длина сжатых данных (исходного массива).
ПРАКТИЧЕСКАЯ РАБОТА
Для всех вариантов разработать программу, которая выполнит подключение к каналу рассылки ZMQ с компьютера преподавателя. Все четные бригады подключаются к каналу «Оригинал текста сонета № 1 Шекспира» и его сжатому варианту. Все нечетные бригады подключаются к каналу «перевод текста сонета № 1 Шекспира» и сжатому варианту. Ключи для подключения к каналам определить из приведенного текста сервера, расположенного на компьютере преподавателя. Ключ для подключения к каналу сжатых сообщений определить самостоятельно.
•Создайте файл с текстом программы на Си в любом текстовом редакторе, выполняющий действия в соответствии с вариантом.
•Откомпилируйте программу при помощи компилятора GNU GCC с указанием, что требуется сборка с библиотеками ZLIB и ZMQ: gcc ./yourprog.c -o ./yourprog.bin -lz -lzmq.
•Выполните отладку программы.
•Запротоколируйте сетевой обмен (tcpdump) и приведите его.
•В процессе выполнения работы пользуйтесь справкой man <функция>.
•В случае досрочного выполнения работы настоятельно рекомендуется приступать к выполнению работы.
46
Передайте на проверку преподавателю:
•текст программы на языке Си;
•протокол обмена данными между компьютером преподавателя
истудента;
•выводы по работе.
Компиляцию программы следует производить при помощи компилятора gcc, который обычно входит в базовую поставку операционной системы. Компьютер преподавателя с установленной и запущенной на нем программой, размещенной в приложении, должен быть подключен к сети и находиться в пределах одного физического сегмента с компьютерами студентов. Для выполнения работы потребуются пакеты libzmq-dev liblz-dev.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1.Назовите возможные режимы работы ZMQ сокет.
2.Возможна ли разнотемповая доставка данных в режиме подписчик/издатель?
3.Какой алгоритм сжатия обеспечивает библиотека Zlib?
47
7. РАЗРАБОТКА СЕТЕВОГО МУЛЬТИМЕДИЙНОГО ПРИЛОЖЕНИЯ
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ И МЕТОДИЧЕСКИЕ УКАЗАНИЯ ДЛЯ ВЫПОЛНЕНИЯ РАБОТЫ
Ранее вы изучили систему распределенной доставки сообщений ZEROMQ (ZMQ, 0MQ). Здесь вы научитесь создавать приложение, способное обрабатывать и воспроизводить потоковые мультимедиа данные. Доставка данных будет осуществляться при помощи UDPрассылки или подписки на ZMQ–PUB-канал.
Обмен данными со звуковым устройством в системе Линукс можно организовать при помощи прямого чтения или записи в соответствующее файл-устройство. Имя файла устройства зависит от версии операционной системы, типа звуковой подсистемы и может иметь вид
/dev/dsp, /dev/audio, /dev/mixer или /dev/psaux. Настройки сигнального процессора звуковой карты можно установить путем вызова функции ioctl() к файловому дескриптору звуковой карты. Например, следующий код устанавливает параметры вывода данных звуковой карты: 16 бит на каждый отсчет, 8 кГц – частота дискретизации, 1 канал (моно).
Приложение считывает 1000 отсчетов с активного входа звуковой карты, а затем проигрывает результат.
#include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> #include <fcntl.h> #include <sys/soundcard.h> #include <stdio.h>
#define AUDIO_DEVICE "/dev/dsp"
void sound_set_eth(void);
int main ()
{
48
sound_set_eth(); return(0);
}
void sound_set_eth(void)
{
int format,nchans,rate; short buf[1000];
int res,res2,audio_fd; printf("SETTINGS\n\r");
audio_fd = open(AUDIO_DEVICE, O_RDWR, 0); if(audio_fd<0) { printf("no dsp\n\r") ;exit(0); } format = AFMT_S16_LE;
ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format); nchans = 1;
ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &nchans); rate = 8000;
ioctl(audio_fd, SNDCTL_DSP_SPEED, &rate); printf("Recording mode: 1000 samples\n\r"); res=read(audio_fd,buf,sizeof(buf)); printf("Playing %d samples\n\r",res); res2=write(audio_fd,buf,res);
}
Для работы с мультимедиа драйверами системы необходимо получить доступ к системе драйверов управления, так называемому устройству «микшер» (mixer). Наиболее часто встречаются микшеры типа ALSA или PULSE AUDIO. В системе, использующей микшер ALSA, устройство /dev/dsp уже готово к работе и может быть использовано сразу после загрузки операционной системы. В системе, построенной на базе PULSE audio (например, современные версии Ubuntu), устройство /dev/dsp не создается, но его также можно использовать в режиме эмуляции через приложение padsp.
Таким образом, в системе Ubuntu для обмена данными через виртуальное устройство /dev/dsp необходимо запускать исполняемый файл через команду padsp {./имя программы}.
49
Мультимедиа оборудование может работать в нескольких режимах, например:
AFMT_S8 – 8 бит на отсчет, число со знаком (char); AFMT_U8 – 8 бит на отсчет, беззнаковое число (unsigned char);
AFMT_S16_LE – 16 бит на отсчет, знаковое, порядок байт в слове little endian;
AFMT_S16_BE – 16 бит на отсчет, знаковое, порядок байт в слове
big endian; |
|
|
|
AFMT_U16_LE – 16 бит на отсчет, |
беззнаковое, |
порядок |
байт |
в слове little endian; |
|
|
|
AFMT_U16_BE – 16 бит на отсчет, |
беззнаковое, |
порядок |
байт |
в слове big endian. |
|
|
|
Подробную информацию о режимах работы звуковой карты можно найти в комментариях в файле sys/soundcard.h .
В реальных приложениях IP телефонии используются специализированные кодеки сжатия данных с потерями, которые предоставляют возможность получать высокие коэффициенты сжатия, обеспечивая приемлемое качество. Для выполнения данной работы будет использован уже знакомый по предыдущим работам алгоритм LZW. Данный алгоритм обеспечивает сжатие без потерь и не является в полной мере оптимальным решением для сетевого аудиовещания (где используются адаптивные кодеки Speex, Vorbis, Layer 3 и другие аналогичные), однако ключевые моменты организации сетевого обмена одинаковы для алгоритмов сжатия всех типов.
ПРАКТИЧЕСКАЯ РАБОТА
Для отладки сохраните поток сервера в файл и направьте его непосредственно в файл-устройство «/dev/dsp» или аналогичное. Для воспроизведения потока устройство «/dev/dsp» должно существовать в системе и быть корректно инициализировано, либо воспользуйтесь утилитой padsp.
Прослушать результат или сделать запись с микрофона можно также командами aplay и arecord (например, aplay /dev/urandom будет проигрывать «белый шум»).
50
