анонс описывает рассылки, посвященные истории NASA (National Aeronautics and Space Administration — НАСА, государственная организация США, занимающаяся исследованием космоса). Описание сеанса SDP состоит из множества строк следующего формата:
type=value
где
type
всегда является одним символом, значение которого зависит от регистра, a
value
— это структурированная текстовая строка, зависящая от значения
type
. Пробелы справа и слева от знака равенства недопустимы.
v=0
(в нашем случае) обозначает версию (version).
o=
обозначает источник (origin). В данном случае имя пользователя не указано, 60345 — идентификатор сеанса, 0 — номер версии этого сеанса,
IN
— тип сети,
IР4
— тип адреса,
128.223.214.198
— адрес. В результате объединения этих пяти элементов — имя пользователя, идентификатор сеанса, тип сети, тип адреса и адрес — образуется глобально уникальный идентификатор сеанса.
s=
задает имя сеанса (session name), а
i=
— это информация о сеансе (information).
u=
указывает URI (Uniform Resource Identifier — уникальный идентификатор ресурса), по которому можно найти более подробную информацию по тематике данного сеанса, а
р=
и
e=
задают номер телефона (phone number) и адрес электронной почты (e-mail) ответственного за данную конференцию.
b=
позволяет оценить пропускную способность, необходимую для приема данного сеанса.
t=
задает время начала и время окончания сеанса в единицах NTP (Network Time Protocol — синхронизирующий сетевой протокол), то есть число секунд, прошедшее с 1 января 1900 года, измеренное в соответствии с UTC (Universal Time Coordinated — универсальное скоординированное время). Данный сеанс является постоянным и не имеет конкретных моментов начала и окончания, поэтому соответствующие времена полагаются нулевыми.
Строки
a=
представляют собой атрибуты, либо сеанса, если они помещены до первой строки
m=
, либо мультимедиа, если они помещены после первой строки
m=
.
Строки
m=
— это анонсы мультимедиа. Первая строка говорит нам о том, что
видео передается на порт 63 096 в формате RTP с использованием профиля аудио и видео (Audio/Video Profile, AVP) с возможными типами данных 32, 31 и 96 (то есть MPEG, H.261 и WBIH соответственно). Строка
c=
сообщает о соединении. В данном случае используется протокол IPv4 с групповым адресом 224.2.245.25 и TTL = 127. Хотя между этими числами стоит символ «косая черта», как в формате CIDR, они ни в коем случае не должны трактоваться как префикс и маска.
Следующая строка
m=
говорит, что аудиопоток передается на порт 31 954 и может иметь один из типов RTP/AVP, некоторые из которых являются стандартными, в то время как другие указаны ниже в виде атрибутов
a=rtpmap:
. Строка
с=
сообщает нам сведения об аудиосоединении: IPv4 с групповым адресом 224.2.216.85 и TTL = 127.
21.10. Отправка и получение
Программа для получения анонсов сеанса многоадресной передачи, показанная в предыдущем разделе, могла только получать дейтаграммы многоадресной передачи. Теперь мы создадим простую программу, способную и отправлять, и получать дейтаграммы многоадресной передачи. Наша программа состоит из двух частей. Первая часть отправляет дейтаграмму многоадресной передачи определённой группе каждые 5 с. Эта дейтаграмма содержит имя узла отправителя и идентификатор процесса. Вторая часть программы — это бесконечный цикл, присоединяющийся к той группе, которой первая часть программы отправляет данные. В этом цикле выводится каждая полученная дейтаграмма (содержащая имя узла и идентификатор процесса отправителя). Это позволяет нам запустить программу на множестве узлов в локальной сети и посмотреть, какой узел получает дейтаграммы от каких отправителей.
В листинге 21.8 показана функция
main
нашей программы.
Листинг 21.8. Создание сокетов, вызов функции fork и запуск отправителя и получателя