All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.tests.mcast Maven / Gradle / Ivy

Go to download

This artifact provides a single jar that contains all classes required to use remote EJB and JMS, including all dependencies. It is intended for use by those not using maven, maven users should just import the EJB and JMS BOM's instead (shaded JAR's cause lots of problems with maven, as it is very easy to inadvertently end up with different versions on classes on the class path).

There is a newer version: 34.0.0.Final
Show newest version

package org.jgroups.tests;

import org.jgroups.util.StackType;
import org.jgroups.util.Util;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.*;
import java.nio.channels.DatagramChannel;
import java.util.Collections;
import java.util.List;


/**
 * Tests IP multicast.
 */
public class mcast {
    protected DatagramSocket  sock;       // for sending of multicasts
    protected InetAddress     mcast_addr=null, bind_addr=null;
    protected int             mcast_port=5555;
    protected final int       local_port;
    protected final int       ttl;
    protected static final boolean        can_bind_to_mcast_addr;
    protected static final StackType      ip_version;
    protected static final ProtocolFamily prot_family;

    static {
        can_bind_to_mcast_addr=(Util.checkForLinux() && !Util.checkForAndroid())
          || Util.checkForSolaris()
          || Util.checkForHp()
          || Util.checkForMac();
        ip_version=Util.getIpStackType();
        prot_family=ip_version == StackType.IPv6? StandardProtocolFamily.INET6 : StandardProtocolFamily.INET;
    }


    public mcast(InetAddress bind_addr, int local_port, InetAddress mcast_addr, int mcast_port, int ttl) {
        this.bind_addr=bind_addr;
        this.local_port=local_port;
        this.mcast_addr=mcast_addr;
        this.mcast_port=mcast_port;
        this.ttl=ttl;
    }

    protected void start() throws Exception {
        Receiver r=null;
        DatagramChannel channel=null;
        try {
            r=new Receiver();
            r.start();

            channel=DatagramChannel.open(prot_family).setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl)
              .bind(new InetSocketAddress(bind_addr, local_port));
            sock=channel.socket();
        }
        catch(Exception ex) {
            if(channel != null)
                channel.close();
            if(r != null) {
                r.kill();
                r.interrupt();
            }
            throw ex;
        }

        DataInputStream in=new DataInputStream(System.in);
        while(true) {
            System.out.print("> ");
            try {
                String line=Util.readLine(in);
                byte[] buf=line.getBytes();
                DatagramPacket packet=new DatagramPacket(buf, buf.length, mcast_addr, mcast_port);
                sock.send(packet);
            }
            catch(Throwable t) {
                t.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        InetAddress mcast_addr=null, bind_addr=null;
        int mcast_port=5555;
        int local_port=0;
        int ttl=8;

        try {
            for(int i=0; i < args.length; i++) {
                String tmp=args[i];
                if("-help".equals(tmp)) {
                    help();
                    return;
                }
                if("-bind_addr".equals(tmp)) {
                    bind_addr=InetAddress.getByName(args[++i]);
                    continue;
                }
                if("-mcast_addr".equals(tmp)) {
                    mcast_addr=InetAddress.getByName(args[++i]);
                    continue;
                }
                if("-mcast_port".equals(tmp)) {
                    mcast_port=Integer.parseInt(args[++i]);
                    continue;
                }
                if("-port".equals(tmp)) {
                    local_port=Integer.parseInt(args[++i]);
                    continue;
                }
                if("-ttl".equals(tmp)) {
                    ttl=Integer.parseInt(args[++i]);
                    continue;
                }
                help();
                return;
            }
            if(mcast_addr == null) {
                switch(ip_version) {
                    case IPv4:
                    case Dual:
                        mcast_addr=InetAddress.getByName("239.5.5.5");
                        break;
                    case IPv6:
                        mcast_addr=InetAddress.getByName("ff0e::8:8:8");
                        break;
                }
            }
        }
        catch(Exception ex) {
            System.err.println(ex);
            return;
        }

        mcast mcast=new mcast(bind_addr, local_port, mcast_addr, mcast_port, ttl);
        mcast.start();
    }



    static void help() {
        System.out.println("mcast [-help]\n" +
                             "      [-bind_addr ]\n" +
                             "      [-port ]\n" +
                             "      [-mcast_addr ]\n" +
                             "      [-mcast_port ]\n" +
                             "      [-ttl ]\n" +
                             "(Note that a null bind_addr will join the receiver multicast socket on all interfaces)\n");
    }

    protected void bindToInterfaces(List interfaces, MulticastSocket s) {
        SocketAddress tmp_mcast_addr=new InetSocketAddress(mcast_addr, mcast_port);
        for(NetworkInterface intf: interfaces) {
            try {
                s.joinGroup(tmp_mcast_addr, intf);
            }
            catch(IOException e) {
                System.err.printf("failed joining interface %s: %s\n", intf, e);
            }
        }
    }


    protected class Receiver extends Thread {
        protected MulticastSocket mcast_sock;

        protected Receiver() throws Exception {
            InetSocketAddress saddr=new InetSocketAddress(mcast_addr, mcast_port);

            if(can_bind_to_mcast_addr)
                mcast_sock=new MulticastSocket(saddr);
            else
                mcast_sock=new MulticastSocket(mcast_port);

            if(bind_addr != null)
                bindToInterfaces(Collections.singletonList(NetworkInterface.getByInetAddress(bind_addr)), mcast_sock);
            else {
                List intf_list=Util.getAllAvailableInterfaces();
                System.out.println("Joining " + saddr + " on interfaces: " + intf_list);
                bindToInterfaces(intf_list, mcast_sock);
            }

            System.out.println("Socket=" + mcast_sock.getLocalAddress() + ':' + mcast_sock.getLocalPort() + ", bind interface=" +
                                 mcast_sock.getNetworkInterface());
        }

        protected void kill() {
            mcast_sock.close();
        }


        public void run() {
            while(true) {
                try {
                    byte[] buf=new byte[1024];
                    DatagramPacket packet=new DatagramPacket(buf, buf.length);
                    mcast_sock.receive(packet);
                    byte[] recv_buf=packet.getData();
                    int recv_len=packet.getLength();
                    System.out.println(new String(recv_buf,0,recv_len) + " [sender=" + packet.getAddress().getHostAddress() +
                            ':' + packet.getPort() + ']');
                }
                catch(Exception ex) {
                    System.err.println("Receiver terminated: " + ex);
                    break;
                }
            }
        }
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy