// thread "sono vivo" per il controllo del master da parte degli slaves
// e per la registrazione di nuovi slaves (a master avviato).

import java.net.*;
import java.io.IOException;

public class AliveThread extends Thread {
  private DatagramSocket s;
  private DatagramPacket indata,outdata;
  private byte inbuf[],outbuf[];
      
  public AliveThread(int p) {
    try { s=new DatagramSocket(p);
          
    } catch(SocketException ex) {
    	  System.out.println("Master$AliveThread: "+ex.toString());
    	  System.exit(p);
    	}
    	catch(SecurityException ex) {
    	  System.out.println("Master$AliveThread: "+ex.toString());
    	  System.exit(p);
    	}	
  }
  
  /* attesa di pacchetti dagli slaves:
     quando riceve un pacchetto vuoto spedisce al mittente la lista degli 
     slaves morti (la lista e' costituita da slave_ip:porta separati
     da \n). Se il pacchetto contiene il msg "aggiungi slave" aggiunge
     lo slave mittente e gli manda la lista degli slaves vivi seguita
     da quella degli slaves morti (le liste sono separate da "***\n").
  */
  public void run() {
    while (true)
     try { // i pacchetti ricevuti possono essere vuoti o possono conte-
           // nere il msg "aggiungi slave".
           inbuf=new byte[14];
           indata=new DatagramPacket(inbuf,inbuf.length);
           s.receive(indata);
           String msg=(new String(indata.getData())).trim();
           String risp;
           if (msg.equals("aggiungi slave"))
                 { // aggiunge il mittente alla lista degli slaves vivi
                   String ip=(indata.getAddress()).getHostAddress();
                   int porta=indata.getPort();
                   ConstantsM.sv.putSlave(ip,porta); 
                   risp=ConstantsM.sv.aliveToString()+"***\n"+ConstantsM.sv.deadToString();
                   System.out.println("Master$AliveThread: aggiunto slave "+ip+":"+porta);
                 }
            else risp=ConstantsM.sv.deadToString();
           outbuf=risp.getBytes(); 
           outdata=new DatagramPacket(outbuf,outbuf.length,indata.getAddress(),indata.getPort());
           s.send(outdata);
           
     } catch(IOException ex) {
     	   System.out.println("Master$AliveThread.run: "+ex.toString());
     	 }		
  }		
} // fine AliveThread