Сам себе IP-телефон. VoIP для программера

Салиев Александр aka Fagot

Xakep, номер #056, стр. 056-062-2


Я вооружился всеми нужными мне описаниями структур в ASN.1, слитыми с сайта ITU-T (должен сказать, что их объем, необходимый для самой примитивной работы, был немалым), и приготовился к созданию горы классов C++ с помощью asnparser'а и к последующей их отладке бессонными ночами. Но и тут фортуна от меня не отвернулась, т.к. оказалось, что ребята из открытой инициативы OpenH323 уже давно сделали это за меня. Естественно было предположить, что opensource'ная команда, работающая в этом направлении не один год, создала более грамотный продукт, чем тот, что сваял бы я в одно лицо, начав с нуля. Приятным сюрпризом оказалось и то, что в библиотеке OpenH323 присутствуют классы для работы с Q.931 и грамотно перегруженные операторы классов iostream, позволяющие выводить для просмотра все пакеты в human-readable виде, а также готовый конструктор высокоуровневых вызовов для создания своего H.323-терминала без особых усилий.

Основными классами, которые используются для погружения в иерархические вложенности данных в пакете, будут PASNSequence и PASNChoice, а точнее, классы, от них унаследованные (ну и, конечно, базовые типы данных, описывающие строки, цифры и т.д.). Sequence, подобно структуре, имеет члены-данные других типов. Проверка на наличие, добавление и исключение этих членов производится с помощью методов HasOptionalFiled(), IncludeOptionalFiled() и RemoveOptionalField() класса PASNSequence. Choice, подобно объединению, может превращаться в различные типы данных, но единовременно - лишь в один. Превращение происходит с помощью явного преобразования типа, а выяснить/установить тип, в который нужно произвести преобразование, можно с помощью установки choice-тегов посредством методов GetTag()/SetTag() класса PASNChoice. Наборы тегов и опциональных полей, соответствующих тому или иному классу, унаследованному от PASNSequence или PASNChoice, можно посмотреть в заголовочных файлах проекта OpenH323, либо в документации на их сайте. Таким образом, сделаем из этого вступления правильные выводы и побежим на сайт OpenH323, чтобы скорее слить и поставить pwlib и openh323lib.

Приступим к действию

Получив в руки библиотеку OpenH323, люди обычно сразу бросаются писать приложения, которые делают из их компа VoIP H.323-телефон. Мы этим заниматься не будем по нескольким причинам: во-первых, это несложно, и, разобрав пример simph323, который поставляется вместе с библиотекой, можно быстро понять, как бросать высокоуровневые вызовы типа "создать на моем интерфейсе 10.0.0.2 H.323-телефон" и "заставить его позвонить на IP 10.0.0.3". Во-вторых, данная работа не дает ни малейшего понятия о непосредственной работе с протоколом. Мы напишем снифер (взяв за основу библиотеку libpcap), попробовав двумя путями отслеживать информацию типа "АОН такой-то пытается позвонить туда-то". Первый метод будет заключаться в том, чтобы обрабатывать непосредственно отснифенную сигнализацию между двумя H.323-устройствами, а второй - в перехвате и декодировании сообщений формата H.225RAS, которыми обмениваются H.323-устройство и гейткипер. Естественно, мы создадим этот снифер для того, чтобы, к примеру, вести статистику разговоров в собственной VoIP-сети, а не для перехвата конфиденциальной информации, потому что, как я думаю, УК ты уважаешь.

Назад на стр. 056-062-1  Содержание  Вперед на стр. 056-062-3