WinSock и мультикастинг
В частности какой сокет нужно создавать TCP или UDP?
Подскажите или ссылку дайте.
Заранее спасибо.
Мультикастовые расширения виндовых сокетов для Win32
--------------------------
О Расширениях мультикастинга
--------------------------
Мультикастовые расширения сокетов для Win32 позволяют приложениям посылать и получать мультикастовые датаграммы.
Мультикастовые датаграммы -разновидность широковещательных датаграмм. Однако, мультикастовые датаграммы получают только те хосты, которые выразили интерес в их получении. Кроме того, если сетевые роутеры сконфигурированы для мершрутизации мультикастовых пакетов, пакеты могут быть посланы вне текущей подсети.
Информация в этом документе - это частично адаптированнsя Секции 3 и 5 из документа "IP Multicast Extensions for 4.3BSD UNIX and related systems (MULTICAST 1.2 Release " от 24 июня 1989 года, написанного Стивом Дирингом). Вы можете получить последнюю полную версию того документа с анонимного FTP gregorio.stanford.edu, каталог /vmtp-ip. Мы с благодарностью подтверждаем доброе разрешение автора использовать этот материал.
---------------------------------------------------------
Замечания относительно Win32 реализации мультикастинга
---------------------------------------------------------
Win32 реализация мультикастинга следует за стандартами мультикастинга версии 1.2 со следующими особенностями:
Нет никакой поддержки IP_MULTICAST_LOOP. Приложение должно вызывать функцию bind для сокета перед установкой любых опций мульткастинга
--------------------------
Использование расширений мультикастинга
--------------------------
Следующие секции обсуждают использование расширений мультикастинга.
------------------------------
Посылка IP мультикастовых датаграмм
------------------------------
Интернет протокол мультикастинга в настоящее время поддерживается только на AF_INET сокетах типа SOCK_DGRAM.
Чтобы посылать мультикастовую датаграмму определите мультикастовый IP адрес в диапазоне от 224.0.0.0 до 239.255.255.255 как адрес назначения в запросе sendto.
По умолчанию, мультикастовые IP датаграммы посылаются со временем жизни (TTL),равным 1, который предотвращает их от отправления вне текущей подсети. Новое значение TTL сокета последовательных мультикастовых датаграмм может быть установлено в любое значение от 0 до 255, чтобы управлять возможностями мультикастинга:
u_char ttl;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl))
Мультикастовые датаграмы с TTL 0 не будут переданы никакой подсети, но могут быть поставлены в местном масштабе, если посылающий хост принадлежит группе назначения. Мультикастовые датаграмы с TTL большим чем 1 могут быть доставлены более чем одной подсети, если есть один или более мультикастовых роутеров объединяющих эти подсети непосредственно. Чтобы обеспечивать контроль возможных значений, мультикастовые роутеры поддерживает понятие "TTL порогов", которые отвергают датаграммы с TTL меньшим некоторых значений. Пороги определяются следующими соглашениями:
Мулькастовые датаграммы с начальным TTL 0 ограничены тем же хостом
Мулькастовые датаграммы с начальным TTL 1 ограничены той же самой подсетью
Мулькастовые датаграммы с начальным TTL 32 ограничены тому же самым участком
Мулькастовые датаграммы с начальным TTL 64 ограничены тем же самым регионом
Мулькастовые датаграммы с начальным TTL 128 ограничены тем же самым континентом
Мультикастовые датаграммы с начальным TTL 255 неограничены в возможностях.
"Участки" и"регионы" строго не определены, и участки могут быть далее подразделены на меньшие административные единицы.
Приложение может выбирать начальное TTL отличное от приведенных выше. Например, приложение могло бы исполнять "поиск расширяемого кольца" для ресурса сети, посылая мультикастинговый запрос сначала с TTL 0, и затем с большим и большим TTL, пока не будет получен ответ, возможно используя TTL последовательность 0, 1, 2, 4, 8, 16, 32.
Многие мультикастовые роутеры отказываются отправлять любые мультикастовые датаграммы с адресом назначения между 224.0.0.0 и 224.0.0.255 включительно, независимо от его TTL. Этот диапазон адресов зарезервирован для использования протоколов маршрутизации и других низкоуровневых протоколов или протоколов обслуживания, таких как открытие шлюзов и групповая политика. Текущая спецификация для IP мультикастинга требует подобного поведения роутеров только для адресов 224.0.0.0 и 224.0.0.1; следующий релиз спецификации, как ожидается, будет содержать эщё больше ограничений.
Каждый мультикастовый акт передачи послылается от единственного интерфейса сети, даже если хост имеет больше чем один интерфейс, способный к мультикастингу. (Если хост также обслуживает мультикастовый роутер, мультикаст может быть отправлен другими интерфейсами, отличными основного, при условии, что TTL больше 1.)
Менеджер системы устанавливает интерфейс по умолчанию, который будет использован для мультикастинга так,как в описанной ниже части процедуры установки . Доступна опция сокета, позволяющая определить интерфейс, отличный от интерфейса по умолчанию, для последующих передач данных от данного сокета:
struct in_addr addr;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr))
Где "addr" - локальный IP адрес желательного исходящего интерфейса. Адрес INADDR_ANY может использоваться для возврата к интерфейсу по умолчанию.
Мультикастовые датаграммы, посланные с начальным TTL большим 1, могут быть отосланы хостом по интерфейсу, отличному от того, по которому они будут посланы, если хост принадлежит группе предназначения на этом другом интерфейс.
--------------------------------
Приём мультикастовых IP датаграмм
--------------------------------
Прежде чем хост может получать мультикастовые IP датаграммы, он должен стать членом одной или более мультикастовых IP групп. Процесс может просить, чтобы хост присоединился к мультикастовой группе, используя следующую опцию сокета:
struct ip_mreq mreq;
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))
Где "mreq" - следующая структура:
struct ip_mreq
{
struct in_addr imr_multiaddr;/* мультикастовая группа,к которой нужно присоединиться */
struct in_addr imr_interface;/* интерфейс для соединения */
}
Каждое членство связано с отдельным интерфейсом, также возможно присоединиться к той же самой группе на более чем одном интерфейсе. "imr_interface" должен быть INADDR_ANY, чтобы выбрать мультикастовый интерфейс по умолчанию, или один из локальных адресов хоста, чтобы выбрать специфический (способный к мультикастингу) интерфейс.
Оставить членство можно, используя:
struct ip_mreq mreq;
setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq))
Где "mreq" содержит те же самые значения, какие использовались, чтобы добавить членство. Членства, связанные с сокетом, будут также оставлены, когда сокет закрыт, или процесс, производящий сокет, убит. Однако, больше чем один сокет может потребовать членства в одной группе, и хост останется членом той группы, пока последняя привязка не покинута.
Членства, связанные с гнездом не обязательно определяют, какие датаграмы принимаются на данном. Поступающие мультикаст-пакеты будут приняты ядром стека протоколов IP, если все сокеты потребовали членства в группе назначения датаграмм; однако, доставка мультикастовых датаграмм специфическому сокету основана на порте назначения, подобно датаграммам уникаст. Чтобы получать мультикастовые датаграммы, посланные специфическому порту, необходимо связать с тем локальным портом, оставляя локальный адрес неуказанный (то есть, INADDR_ANY).
Больше чем один процесс могут связывать с тем же самым SOCK_DGRAM UDP портом, если связыванию предшествует:
int one = 1;
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof (one))
В этом случае, каждая поступающая мультикастовая или широковещательная UDP датаграмма, предназначенная для общего порта, будет доставлена всем сокетам, связанным с таким портом. По причинам обратной совместимости, ЭТО НЕ ПРИМЕНЯЕТСЯ К ПРИХОДЯЩИМ УНИКАСТ ДАТАГРАММАМ - уникаст датаграммы никогда не будут поставлены больше чем одному сокету, независимо от того, сколько сокетов связаны с портом назначения датаграмм.
Определения, требуемые для новых, мультикаст-ориентированных опций сокетов даны в файле winsock.h, которым снабжен Win32 SDK для Windows NT 3.5. Все адреса IP задаются в сетевом формате байт.
------------------------------------------
Установление мультикастового интерфейса по умолчанию
------------------------------------------
Выбор мультикастового интерфейса по умолчанию управляется через таблицу маршрутизации уникаст ядра. Если нет никакого мультикастового маршрута в таблице, все мультикастовые посылки будут, по умолчанию, пересылаться через интерфейс, связанный с шлюзом по умолчанию. Если этот интерфейс не поддерживает мультикастинг, попытки посылать данные вызовут ошибку WSAENETUNREACH.
Маршрут может быть добавлен для специфического мультикастового адреса или для всех мультикастовых адресов, направляющий их на различные интерфейсы по умолчанию. Например, чтобы указать, что мультикаст-датаграммы, адресованные к 224.0.1.3 должны, по умолчанию, пересылаться на интерфейс с локальным адресом 36.2.0.8, необходимо использование следующее:
route add 224.0.1.3 36.2.0.8 0
Для устанавки интерфейса по умолчанию для всех мультикаст-адресов, отличных от индивидуальных маршрутами для интерфейса 36.11.0.1, используйте:
route add 224.0.0.0 36.11.0.1 0
Если Вы направляете мультикаст-маршрут в интерфейс, который не поддерживает мультикаст, попытка послать мультикаст через этот маршрут вызовет ошибку WSAENETUNREACH.
GENA_DJ, огромное СПАСИБО!!! Ща разберусь и зафлудю весь инет :devil: :D