package org.jgroups.tests;
import java.io.DataInputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* Same as McastSenderTest, but uses all available interfaces (including loopback) to send the packets
*
* @author Bela Ban
* @version $Revision: 1.7 $
* @see McastReceiverTest
*/
public class McastSenderTest {
public static void main(String args[]) {
MulticastSocket[] sockets=null;
MulticastSocket sock;
InetAddress mcast_addr=null, bind_addr=null;
DatagramPacket packet;
byte[] buf=new byte[0];
String tmp;
int ttl=32;
String line;
DataInputStream in;
AckReceiver ack_receiver=null;
int port=5555;
try {
for(int i=0; i < args.length; i++) {
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("-ttl".equals(tmp)) {
ttl=Integer.parseInt(args[++i]);
continue;
}
if("-port".equals(tmp)) {
port=Integer.parseInt(args[++i]);
continue;
}
help();
return;
}
if(mcast_addr == null)
mcast_addr=InetAddress.getByName("224.0.0.150");
}
catch(Exception ex) {
System.err.println(ex);
return;
}
try {
List<InetAddress> v=new ArrayList<InetAddress>();
for(Enumeration en=NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf=(NetworkInterface)en.nextElement();
for(Enumeration e2=intf.getInetAddresses(); e2.hasMoreElements();) {
bind_addr=(InetAddress)e2.nextElement();
v.add(bind_addr);
}
}
sockets=new MulticastSocket[v.size()];
for(int i=0; i < v.size(); i++) {
sock=new MulticastSocket(port);
sock.setTimeToLive(ttl);
sock.setInterface(v.get(i));
sockets[i]=sock;
ack_receiver=new AckReceiver(sock);
ack_receiver.start();
}
for(int i=0; i < sockets.length; i++) {
sock=sockets[i];
if(sock == null) continue;
System.out.println("Socket #" + (i + 1) + '=' + sock.getLocalAddress() + ':' + sock.getLocalPort() +
", ttl=" + sock.getTimeToLive() + ", bind interface=" + sock.getInterface());
}
in=new DataInputStream(System.in);
while(true) {
System.out.print("> ");
line=in.readLine();
if(line.startsWith("quit") || line.startsWith("exit"))
System.exit(0);
buf=line.getBytes();
packet=new DatagramPacket(buf, buf.length, mcast_addr, port);
send(packet, sockets); // send on all interfaces
}
}
catch(Exception e) {
System.err.println(e);
}
}
static void send(DatagramPacket packet, MulticastSocket[] sockets) {
if(packet == null || sockets == null) return;
for(int i=0; i < sockets.length; i++) {
try {
if(sockets[i] != null)
sockets[i].send(packet);
}
catch(Exception ex) {
System.err.println("McastSenderTest.send(): " + ex);
}
}
}
static void help() {
System.out.println("McastSenderTest [-bind_addr <bind address>] [-help] [-mcast_addr <multicast address>] " +
"[-port <multicast port that receivers are listening on>] " +
"[-ttl <time to live for mcast packets>] [-use_all_interfaces]");
}
private static class AckReceiver implements Runnable {
DatagramSocket sock;
DatagramPacket packet;
byte[] buf;
Thread t=null;
AckReceiver(DatagramSocket sock) {
this.sock=sock;
}
public void run() {
while(t != null) {
try {
buf=new byte[256];
packet=new DatagramPacket(buf, buf.length);
sock.receive(packet);
System.out.println("<< Received packet from " +
packet.getAddress().getHostAddress() + ':' +
packet.getPort() + ": " + new String(packet.getData()));
}
catch(Exception e) {
System.err.println(e);
break;
}
}
t=null;
}
void start() {
t=new Thread(this, "McastSenderTest.AckReceiver thread");
t.start();
}
void stop() {
if(t != null && t.isAlive()) {
t=null;
try {
sock.close();
}
catch(Exception e) {
}
}
}
}
}