UNIX: разработка сетевых приложений
about IP/TV and the client needed to view this program is availablefrom http://videolab.uoregon.edu/download.htmlu=http://videolab.uoregon.edu/e=Hans Kuhn < [email protected]>p=Hans Kuhn <541/346-1758>b=AS:1000t=0 0a=type:broadcasta=tool:IP/TV Content Manager 3.2.24a=x-iptv-file:1 name y:25yop1234567890123.mpgm=video 63096 RTP/AVP 32 31 96c=IN IP4 224.2.245.25/127a=framerate:30a=rtpmap:96 WBIH/90000a=x-iptv-svr:video blaster2.uoregon.edu file 1 loopm=audio 31954 RTP/AVP 14 96 0 3 5 97 98 99 100 101 102 10 11 103 104 105 106c=IN IP4 224.2.216.85/127a=rtpmap:96 X-WAVE/8000a=rtpmap:97 L8/8000/2a=rtpmap:98 L8/8000a=rtpmap:99 L8/22050/2a=rtpmap:100 L8/22050a=rtpmap:101 L8/11025/2a=rtpmap:102 L8/11025a=rtpmap:103 L16/22050/2a=rtpmap:104 L16/22050a=rtpmap:105 L16/11025/2a=rtpmap:106 L16/11025a=x-iptv-svr:audio blaster2.uoregon.edu file 1 loopЭтот анонс описывает рассылки, посвященные истории NASA (National Aeronautics and Space Administration — НАСА, государственная организация США, занимающаяся исследованием космоса). Описание сеанса SDP состоит из множества строк следующего формата:
type=valueгде
всегда является одним символом, значение которого зависит от регистра, atype— это структурированная текстовая строка, зависящая от значенияvalue. Пробелы справа и слева от знака равенства недопустимы.type(в нашем случае) обозначает версию (version).v=0■
обозначает источник (origin). В данном случае имя пользователя не указано, 60345 — идентификатор сеанса, 0 — номер версии этого сеанса,o=— тип сети,IN— тип адреса,IР4— адрес. В результате объединения этих пяти элементов — имя пользователя, идентификатор сеанса, тип сети, тип адреса и адрес — образуется глобально уникальный идентификатор сеанса.128.223.214.198■
задает имя сеанса (session name), аs=— это информация о сеансе (information).i=указывает URI (Uniform Resource Identifier — уникальный идентификатор ресурса), по которому можно найти более подробную информацию по тематике данного сеанса, аu=ир=задают номер телефона (phone number) и адрес электронной почты (e-mail) ответственного за данную конференцию.e=■
позволяет оценить пропускную способность, необходимую для приема данного сеанса.b=■
задает время начала и время окончания сеанса в единицах NTP (Network Time Protocol — синхронизирующий сетевой протокол), то есть число секунд, прошедшее с 1 января 1900 года, измеренное в соответствии с UTC (Universal Time Coordinated — универсальное скоординированное время). Данный сеанс является постоянным и не имеет конкретных моментов начала и окончания, поэтому соответствующие времена полагаются нулевыми.t=■ Строки
представляют собой атрибуты, либо сеанса, если они помещены до первой строкиa=, либо мультимедиа, если они помещены после первой строкиm=.m=■ Строки
— это анонсы мультимедиа. Первая строка говорит нам о том, что видео передается на порт 63 096 в формате RTP с использованием профиля аудио и видео (Audio/Video Profile, AVP) с возможными типами данных 32, 31 и 96 (то есть MPEG, H.261 и WBIH соответственно). Строкаm=сообщает о соединении. В данном случае используется протокол IPv4 с групповым адресом 224.2.245.25 и TTL = 127. Хотя между этими числами стоит символ «косая черта», как в формате CIDR, они ни в коем случае не должны трактоваться как префикс и маска.c=Следующая строка
говорит, что аудиопоток передается на порт 31 954 и может иметь один из типов RTP/AVP, некоторые из которых являются стандартными, в то время как другие указаны ниже в виде атрибутовm=. Строкаa=rtpmap:сообщает нам сведения об аудиосоединении: IPv4 с групповым адресом 224.2.216.85 и TTL = 127.с=21.10. Отправка и получение
Программа для получения анонсов сеанса многоадресной передачи, показанная в предыдущем разделе, могла только получать дейтаграммы многоадресной передачи. Теперь мы создадим простую программу, способную и отправлять, и получать дейтаграммы многоадресной передачи. Наша программа состоит из двух частей. Первая часть отправляет дейтаграмму многоадресной передачи определённой группе каждые 5 с. Эта дейтаграмма содержит имя узла отправителя и идентификатор процесса. Вторая часть программы — это бесконечный цикл, присоединяющийся к той группе, которой первая часть программы отправляет данные. В этом цикле выводится каждая полученная дейтаграмма (содержащая имя узла и идентификатор процесса отправителя). Это позволяет нам запустить программу на множестве узлов в локальной сети и посмотреть, какой узел получает дейтаграммы от каких отправителей.
В листинге 21.8 показана функция
нашей программы.mainЛистинг 21.8. Создание сокетов, вызов функции fork и запуск отправителя и получателя
//mcast/main.c1 #include "unp.h"2 void recv_all(int, socklen_t);3 void send_all(int. SA *, socklen_t);4 int5 main(int argc, char **argv)6 {7 int sendfd, recvfd;8 const int on = 1;9 socklen_t salen;10 struct sockaddr *sasend, *sarecv;