IP multicasting в c#

Перевод: IP multicasting in c#

Данная статья показывает, как создать простой клиент/сервер для создания multicasting приложения в c#. Автор считает, что с ростом пропускной способности и увеличения использования потокового видео, multicasting станет окончательным методом передачи данных в ближайшем будущем.

 Что такое IP мультикастинг(multicasting)

«Многоадресная IP-рассылка (IP multicasting) это технология, которая позволяет снизить трафик за счет одновременной доставки одного потока информации тысячам получателей одновременно.»CSCO01

Концепция многоадресной рассылки схожа с наземным или спутниковым телевизионным вещанием.  Есть один спутник и много приемников.

Требования для IP multicasting

Для многоадресной рассылки  все маршрутизаторы на пути сообщения должен поддерживать многоадресную рассылку.

Сетевой интерфейс операционной системы также должнен иметь поддержку многоадресной рассылки

Приложение использующее IP multicast

RFC1112 «Host Extensions for IP Multicasting» (http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1112.html) — рекомендует ряд API вызовов для поддержки IP Multicasting, таких как:

  • Присоединение к мультикаст группе;
  • Выход из мультикаст группы;
  • Установка значения TTL для мультикаст группы

Отправка данных в multicast группу

Для передачи данных в группу многоадресной рассылки необходимо вступить (присоединиться) в группу многоадресной рассылки, установить значение TTL для данных, и затем уже можно передавать данные группе. Все это будет показано ниже.

Socket s=new Socket(AddressFamily.InterNetwork, 
				SocketType.Dgram, ProtocolType.Udp);

Для начала создаем простой UDP сокет.

IPAddress ip=IPAddress.Parse("224.5.6.7");

Теперь нам нужно присоединиться к группе многоадресной рассылки. Multicast IP адреса находятся в диапазоне 224.0.0.0 — 239.255.255.255. Мы можем присоединиться к любому из этих адресов, но большинстве случаев мы будем использовать 224.5.6.7 в качестве примера.

s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership, new MulticastOption(ip));

Установили необходимую опцию для присоединения к группе.

s.SetSocketOption(SocketOptionLevel.IP, 
		SocketOptionName.MulticastTimeToLive, 2);

Задаем время жизни для сокета — это очень важно для возможностей многоадресной передачи данных. Значение 1 означает что многоадресная передача данных не выйдет за пределы локальной сети. Установка значения >1  позволит многоадресной передаче данных пройти через несколько маршрутизаторов. Каждый маршрутизатор будет уменьшать значение TTL на 1.

IPEndPoint ipep=new IPEndPoint(ip, 4567);
s.Connect(ipep);

Здесь мы создаем конечную точку, которая позволяет нам отправлять и  передавать данные, то есть, мы связываем сокет с этой конечной точкой. Теперь мы полноправные члены группы многоадресной рассылки и можем передавать данные в группу.

//Создаем строку из символов ABCDEFGHIJ
byte[] b=new byte[10];
for(int x=0;x<b.Length;x++) b[x]=(byte)(x+65);

s.Send(b,b.Length,SocketFlags.None);

s.Close();

Мы послали строку «ABCDEFGHIJ» в группу многоадресной рассылки 224.5.6.7 на порт 4567. Все приложения, которые слушают этот порт и являются членами группы, получат эти данные.

Получение данных из multicast группы

Получить данные проще чем послать их 8)

Socket s=new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
 			ProtocolType.Udp);

Также создаем UDP сокет.

IPEndPoint ipep=new IPEndPoint(IPAddress.Any, 4567);
s.Bind(ipep);

Создаем конечную точку, на входящие данные на любой IP адрес, на порт 4567.

IPAddress ip=IPAddress.Parse("224.5.6.7");

s.SetSocketOption(SocketOptionLevel.IP,
    SocketOptionName.AddMembership,
        new MulticastOption(ip,IPAddress.Any));

Присоединяемся к multicast группе 224.5.6.7

byte[] b=new byte[1024];
s.Receive(b);
string str = System.Text.Encoding.ASCII.GetString(b,0,b.Length);
Console.WriteLine(str.Trim());

Получаем данные отправленные в multicast группу.

3 Replies to “IP multicasting в c#”

    1. Честно говоря я не в курсе (( так и не начал копать глубже… интересы ушли в другое русло 8(

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *