Multicast Sockets

видове маршрутизация:
bradcast image
broadcast
multicast image
multicast
unicast image
unicast
unicast vs muticast image multicast



unicast


Time to live  - ttl      Ако  ttl =5

time to live image
TTL Обхват
0 Ограниченодо локалния компютър.
1 Ограничено до локалната мрежа. Не се рутира.
до 32
Ограничено до сайта, организацията или департамента
до 64
Ограничено в рамките на региона.
до128
В рамките на континента
до 255
Без ограничения - глобален



 Адреси:  IPv4 мултикаст адреси започват с 1110. Групата включва адреси от  224.0.0.0 до 239.255.255.255. Подробна спецификация  -  RFC 5771
Резервирани адреси: - започващи с  224.0.0


Някои мултикаст адреси: (източник  http://www.tcpipguide.com/free/t_IPMulticastAddressing.htm )

Start Address End Address Uses
224.0.0.0 224.0.0.255 Reserved for special "well known" multicast addresses
224.0.1.0 238.255.255.255 Globally scoped (Internet-wide) multicast address
239.0.0.0 239.255.255.255 Administratively scoped (local) multicast addresses


Пример:

В примера при инициализацията си клиентите създават буфер от байтове и го използват за създаване на DatagramPacket, след което създават MulticastSocket на зададен порт и се присъединяват към група на избран мултикаст адрес.
В случая клиентите са пасивната страна - те чакат изпращане на пакет от сървъра, след което извличат текстовата информация от него и я извеждат на екрана. При получаване на съобщение "END_FILE", прекратяват връзката затваряйки сокета.

Сървърът в цикъл подготвя текстово съобщение, което използва за създаване на
DatagramPacket, със избрания мултикаст адрес и порта на клиента и го изпраща. Последното съобщение е "END_FILE" за прекратяване на сесията.

клиент:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class Client {
    static int mcPort=9090;
    static String address="230.0.1.0";;

    public static void main(String[] args) throws     IOException { 

        byte[] buffer=new byte[1024];
        MulticastSocket socket=new MulticastSocket(mcPort);
        InetAddress adr=InetAddress.getByName(address);
        socket.joinGroup(adr);
        DatagramPacket packet=new DatagramPacket(buffer,
                buffer.length);
        System.out.println("Waiting for multicast messages");
        while(true){                       
            socket.receive(packet);
            String msg=new String(packet.getData(),
                    packet.getOffset(),packet.getLength());
            System.out.println(msg);
                    if("END_FILE".equals(msg)) {
                        System.out.println("No more message. Exiting : ");
                        break;
                    }
        }
        socket.leaveGroup(adr);
        socket.close();
    }
}

Сървър:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Server {
    static int mcPort=9090;
    static String address= "230.0.1.0";
    static DatagramSocket socket;
    static InetAddress iAdr;

    public static void send(String message) throws IOException {       
        byte[] msg = message.getBytes();
        DatagramPacket packet = new DatagramPacket(msg, msg.length,
                iAdr, mcPort);
        socket.send(packet);       
    }

    public static void main(String[] args) throws IOException {
        socket = new DatagramSocket();
        iAdr = InetAddress.getByName(address);
        for(int i=0;i<20;i++) {
            send("This is a multicast message "+i);
        }
        send("END_FILE");
        socket.close();
    }
}




IPv6 - multicast adressing