package dmg.protocols.snmp ; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.util.Iterator; import java.util.Vector; /** * * * @author Patrick Fuhrmann * @version 0.1, 15 Feb 1998 */ public class SnmpServer implements Runnable { Vector<SnmpEventListener> _actionListener = new Vector<>() ; int _port ; DatagramSocket _socket ; Thread _listenThread ; public SnmpServer( int port ) throws SocketException { _port = port ; _socket = new DatagramSocket( port ) ; _listenThread = new Thread( this ) ; _listenThread.start(); } public void addSnmpEventListener( SnmpEventListener listener ){ _actionListener.addElement( listener ) ; } @Override public void run(){ if( Thread.currentThread() == _listenThread ){ while(true){ try{ byte [] b = new byte[2048] ; DatagramPacket p = new DatagramPacket( b , b.length ) ; _socket.receive( p ) ; SnmpObject snmp = SnmpObject.generate( p.getData(),0, p.getLength()); SnmpRequest request = new SnmpRequest( snmp ) ; SnmpEvent event = new SnmpEvent( p.getAddress() , request ) ; Iterator<SnmpEventListener> iterator = _actionListener.iterator(); SnmpEventListener listener ; while (iterator.hasNext()) { listener = iterator.next(); SnmpRequest answer = listener.snmpEventArrived(event); if (answer == null) { System.out.println("Answer discarded"); continue; } byte[] x = answer.getSnmpBytes(); DatagramPacket dp = new DatagramPacket( x, x.length, p.getAddress(), p.getPort()); System.out.println("Sending " + x.length + " bytes to " + p.getAddress() + ':' + p.getPort()); _socket.send(dp); } }catch( Exception e ){ System.out.println( "Error while sending : "+e ) ; } } } } }