//by Nasser M. Abbasi
import java.net.*;
import java.io.FileOutputStream;

class PortListen {
    static private final boolean PKT= false; // make true to save pkt to a file
    static private final boolean DEBUG = false;

    static private DatagramSocket _trapSocket = null;

    static private final int _BUFFER_SIZE = 8 * 1024;
    static private long _numberOfUDP_pkts=0;

    public static void main(String args[]) throws Exception
    {
        if ( args.length != 1 ) {
            System.err.println("usage: portlisten <port>");
            return;
        }

        int port=0;

        try {
            port= new Integer(args[0]).intValue();           
        }
        catch ( Exception e ) {
            System.err.println("invalid port number supplied \""+ args[0] + "\"");
        }

        init(port);
        run();
    }

    static private void init(int portNumber) throws Exception
    {

        try {
            _trapSocket    = new DatagramSocket(portNumber);
        }
        catch ( SocketException e ) {
            System.err.println("Socket thread Exception creating socket");
            throw e;
        }
    }

    static private void savePkt(int howMany, byte buf[]) 
    {
        try {
            java.io.File file = new java.io.File("pkt.log");
            System.err.println("pkt will be written to " + file.getAbsolutePath());

            FileOutputStream f = new FileOutputStream("pkt.log");
            for ( int j = 0; j < howMany; j++ )
                f.write(buf[j]);

            f.close();
        }
        catch ( Exception exp ) {
            System.err.println("Exeption in savePkts");
            exp.printStackTrace();
        }
    }


    static private void run() throws ThreadDeath, Exception
    {
        byte[] buf = null;
        buf = new byte[_BUFFER_SIZE];

        MAIN_LOOP:
        while ( true ) {
            try {

                DatagramPacket pkt = new DatagramPacket(buf, buf.length);

                // blocking operation
                _trapSocket.receive(pkt);

                System.err.println("got UDP pkt size="+ "length=" +  pkt.getLength() );

                if ( _numberOfUDP_pkts == Long.MAX_VALUE )
                    _numberOfUDP_pkts = 0;

                _numberOfUDP_pkts++;              

                System.err.println("UDP pkts read so far:" + _numberOfUDP_pkts);

                if ( PKT ) {
                    savePkt(pkt.getLength(), buf);
                }
            }
            catch ( Exception e ) {
                System.err.println("Exeption in run");
                e.printStackTrace();
                throw e;
            }
        }//while(...)
    }
}
