/* * * Copyright (C) Andrew Smith 2013 * * Usage: java MCast [-v] code toaddr port replyport wait * * If any are missing or blank they use the defaults: * * -v means report how long the last reply took * * code = 'FTW' * toaddr = '224.0.0.75' * port = '4028' * replyport = '4027' * wait = '1000' * */ import java.net.*; import java.io.*; import java.util.*; class MCast implements Runnable { static private final String MCAST_CODE = "FTW"; static private final String MCAST_ADDR = "224.0.0.75"; static private final int MCAST_PORT = 4028; static private final int MCAST_REPORT = 4027; static private final int MCAST_WAIT4 = 1000; static private String code = MCAST_CODE; static private String addr = MCAST_ADDR; static private int port = MCAST_PORT; static private int report = MCAST_REPORT; static private int wait4 = MCAST_WAIT4; private InetAddress mcast_addr = null; static private final Integer lock = new Integer(666); static private boolean ready = false; static private Thread listen = null; static public boolean verbose = false; static private Date start = null; static private Date last = null; static boolean got_last = false; static public void usAge() { System.err.println("usAge: java MCast [-v] [code [toaddr [port [replyport [wait]]]]]"); System.err.println(" -v=report elapsed ms to last reply"); System.err.println(" Anything below missing or blank will use it's default"); System.err.println(" code=X in cgminer-X-Port default="+MCAST_CODE); System.err.println(" toaddr=multicast address default="+MCAST_ADDR); System.err.println(" port=multicast port default="+MCAST_PORT); System.err.println(" replyport=local post to listen for replies default="+MCAST_REPORT); System.err.println(" wait=how long to wait for replies default="+MCAST_WAIT4+"ms"); System.exit(1); } private int port(String _port, String name) { int tmp = 0; try { tmp = Integer.parseInt(_port); } catch (NumberFormatException nfe) { System.err.println("Invalid " + name + " - must be a number between 1 and 65535"); usAge(); System.exit(1); } if (tmp < 1 || tmp > 65535) { System.err.println("Invalid " + name + " - must be a number between 1 and 65535"); usAge(); System.exit(1); } return tmp; } public void set_code(String _code) { if (_code.length() > 0) code = _code; } public void set_addr(String _addr) { if (_addr.length() > 0) { addr = _addr; try { mcast_addr = InetAddress.getByName(addr); } catch (Exception e) { System.err.println("ERR: Invalid multicast address"); usAge(); System.exit(1); } } } public void set_port(String _port) { if (_port.length() > 0) port = port(_port, "port"); } public void set_report(String _report) { if (_report.length() > 0) report = port(_report, "reply port"); } public void set_wait(String _wait4) { if (_wait4.length() > 0) { try { wait4 = Integer.parseInt(_wait4); } catch (NumberFormatException nfe) { System.err.println("Invalid wait - must be a number between 0ms and 60000ms"); usAge(); System.exit(1); } if (wait4 < 0 || wait4 > 60000) { System.err.println("Invalid wait - must be a number between 0ms and 60000ms"); usAge(); System.exit(1); } } } public void run() // listen { byte[] message = new byte[1024]; DatagramSocket socket = null; DatagramPacket packet = null; try { socket = new DatagramSocket(report); packet = new DatagramPacket(message, message.length); synchronized (lock) { ready = true; } while (true) { socket.receive(packet); synchronized (lock) { last = new Date(); } int off = packet.getOffset(); int len = packet.getLength(); System.out.println("Got: '" + new String(message, off, len) + "' from" + packet.getSocketAddress()); } } catch (Exception e) { socket.close(); } } public void sendMCast() { try { String message = new String("cgminer-" + code + "-" + report); MulticastSocket socket = null; DatagramPacket packet = null; socket = new MulticastSocket(); packet = new DatagramPacket(message.getBytes(), message.length(), mcast_addr, port); System.out.println("About to send " + message + " to " + mcast_addr + ":" + port); start = new Date(); socket.send(packet); socket.close(); } catch (Exception e) { e.printStackTrace(); } } public void init() { MCast lis = new MCast(); listen = new Thread(lis); listen.start(); while (true) { synchronized (lock) { if (ready) break; } try { Thread.sleep(100); } catch (Exception sl1) { } } try { Thread.sleep(500); } catch (Exception sl2) { } sendMCast(); try { Thread.sleep(wait4); } catch (Exception sl3) { } listen.interrupt(); if (verbose) { try { Thread.sleep(100); } catch (Exception sl4) { } synchronized (lock) { if (last == null) System.out.println("No replies received"); else { long diff = last.getTime() - start.getTime(); System.out.println("Last reply took " + diff + "ms"); } } } System.exit(0); } public MCast() { } public static void main(String[] params) throws Exception { int p = 0; MCast mcast = new MCast(); mcast.set_addr(MCAST_ADDR); if (params.length > p) { if (params[p].equals("-?") || params[p].equalsIgnoreCase("-h") || params[p].equalsIgnoreCase("-help") || params[p].equalsIgnoreCase("--help")) MCast.usAge(); else { if (params[p].equals("-v")) { mcast.verbose = true; p++; } if (params.length > p) { mcast.set_code(params[p++]); if (params.length > p) { mcast.set_addr(params[p++]); if (params.length > p) { mcast.set_port(params[p++]); if (params.length > p) { mcast.set_report(params[p++]); if (params.length > p) mcast.set_wait(params[p]); } } } } } } mcast.init(); } }