aboutsummaryrefslogtreecommitdiff
path: root/src/IvyWatcher.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/IvyWatcher.java')
-rwxr-xr-xsrc/IvyWatcher.java166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/IvyWatcher.java b/src/IvyWatcher.java
new file mode 100755
index 0000000..21311e9
--- /dev/null
+++ b/src/IvyWatcher.java
@@ -0,0 +1,166 @@
+/*
+*
+* IvyWatcher : gestion des messages UDP pour annoncer les arrivées
+*
+*/
+package fr.dgac.ivy ;
+
+import java.lang.Thread;
+import java.net.*;
+import java.io.*;
+import java.util.StringTokenizer;
+import gnu.regexp.*;
+import java.util.Vector;
+public class IvyWatcher extends Thread {
+ Ivy bus; /* master bus controler */
+ DatagramSocket broadcast; /* supervision socket */
+ private Vector domainaddrList;
+ private static boolean debug = (System.getProperty("IVY_DEBUG")!=null);
+
+ public void close() {
+ broadcast.close();
+ }
+ private void sendBroadcast( String data, String net ) throws IvyException
+ {
+ DatagramPacket packet;
+ // transformation en forme de broadcast w.x.y.z en w.x.y.255
+ try {
+ // simple trick to expend to 255 thank's Alex
+ net += ".255.255.255";
+ RE exp = new RE( "^(\\d+\\.\\d+\\.\\d+\\.\\d+).*");
+ net = exp.substitute( net , "$1" );
+ } catch ( REException e ){
+ throw new IvyException("Bad broascat addr");
+ }
+ // broadcast sur l'adresse iadr
+ try {
+ InetAddress iaddr = InetAddress.getByName(net);
+ domainaddrList.addElement( iaddr );
+ packet = new DatagramPacket(
+ data.getBytes(),
+ data.length(),
+ iaddr,
+ broadcast.getLocalPort() );
+ broadcast.send( packet );
+ } catch ( UnknownHostException e ) {
+ throw new IvyException("Broadcast sur réseau inconnu " + e );
+ } catch ( IOException e ) {
+ throw new IvyException("broadcast send erreur " + e );
+ }
+ }
+ public void sendStart(String domain) throws IvyException {
+ String domainaddr;
+ // parse Domain to get port number
+ int port;
+ int sep_index = domain.lastIndexOf( ":" );
+ if ( sep_index == -1 )
+ {
+ port = bus.DEFAULT_PORT;
+ domainaddr = domain;
+ }
+ else
+ {
+ port = Integer.parseInt( domain.substring( sep_index +1 ));
+ domainaddr = domain.substring(0,sep_index);
+ }
+ // create the UDP socket
+ try {
+ broadcast = new MulticastSocket(port );
+ } catch ( IOException e ) {
+ throw new IvyException("IvyWatcher erreur I/O" + e );
+ }
+ // start UDP receiver
+ start();
+ // send hello world on UDP sockets
+ String hello = "3 "+bus.getApplicationPort()+"\n";
+ StringTokenizer st = new StringTokenizer(domainaddr," \t:,");
+ while ( st.hasMoreTokens()) {
+ sendBroadcast( hello, st.nextToken() );
+ }
+ }
+
+ IvyWatcher(Ivy bus) throws IvyException {
+ this.bus = bus;
+ domainaddrList = new Vector();
+ }
+
+ public void run() {
+ DatagramPacket packet;
+ byte buf[] = new byte[256];
+ int port;
+ int version;
+ /**/
+ traceDebug("IvyWatcher waiting for Broadcast");
+ while( bus.ivyRunning() )
+ {
+ try {
+ /* receive antoher application port */
+ packet = new DatagramPacket(buf, 256);
+ broadcast.receive( packet );
+ String msg = new String(packet.getData()) ;
+ InetAddress remotehost = packet.getAddress();
+ traceDebug("BUSWATCHER Receive Broadcast from:"+
+ remotehost.getHostName()+
+ ":"+packet.getPort()
+ +"'"+msg+"'");
+ // check if remoteaddr is in our broadcast domain list
+ if ( !isInDomain( remotehost ) )
+ continue;
+ StringTokenizer st = new StringTokenizer(msg);
+ if ( ! st.hasMoreTokens()) {
+ System.err.println("Bad format "+msg);
+ continue;
+ }
+ version = Integer.parseInt( st.nextToken() );
+ if ( ! st.hasMoreTokens()) {
+ System.err.println("Bad format "+msg);
+ continue;
+ }
+ port = Integer.parseInt( st.nextToken() );
+ // TODO: More checking here host port domain etc....
+ if ( (bus.getApplicationPort() == port) )
+ {
+ continue;
+ }
+ traceDebug("BUSWATCHER Broadcast de "
+ +packet.getAddress().getHostName()+":"+packet.getPort()+" port "+port);
+ /* connect to the application */
+ try {
+ Socket socket = new Socket( remotehost, port );
+ bus.addClient( socket );
+ } catch ( UnknownHostException e ) {
+ System.err.println("Unkonwn host "+remotehost);
+ } catch ( IOException e) {
+ System.err.println("can't connect to "+remotehost+" port "+port);
+ }
+
+ } catch ( IOException e ) {
+ // TODO: comment distinger la fin normale de 'erreur
+ /* fermeture de la socket arret normal */
+ traceDebug("Error IvyWatcher exception: " + e.getMessage());
+ }
+ }// end while
+ }
+
+ private void traceDebug(String s){
+ if (debug) System.out.println("-->ivywatcher<-- "+s);
+ }
+ private boolean isInDomain( InetAddress host ){
+ byte rem_addr[] = host.getAddress();
+ for ( int i = 0 ; i < domainaddrList.size(); i++ )
+ {
+ byte addr[] = ((InetAddress)domainaddrList.elementAt(i)).getAddress();
+ int j ;
+ for ( j = 0 ; j < 4 ; j++ )
+ if ( (addr[j] != -1) && (addr[j] != rem_addr[j]) ) break;
+ if ( j == 4 )
+ {
+ traceDebug( "host " + host + " is in domain\n" );
+ return true;
+ }
+ }
+ traceDebug( "host " + host + " Not in domain\n" );
+ return false;
+ }
+}
+