Trace-route/ping application using ICMP from Jpcap. More...


Public Member Functions | |
| TraceroutePane (String args[]) | |
Creates a new instance of the ChatClientFrame. | |
| void | println (String str) |
| println() == short cut for logMesage() + logNewLine () without timestamp | |
| void | logNewLine () |
| Logs new line. | |
| void | logMessage (String str, boolean timestamp) |
| Logs message, with optional timestamp. | |
| void | onTracerouteCompleted () |
On trace route completed call-back from the instance of Traceroute | |
| void | parseCommand () |
| Parses input message or command from inputMsg. | |
Static Public Member Functions | |
| static void | main (String args[]) |
| Main entry point. | |
Private Member Functions | |
| void | startButton_Clicked (MouseEvent evt) |
Starts fetching data from URL specified in urlText. | |
Static Private Member Functions | |
| static String | now () |
| Gets current time stamp (millis resolution) | |
Private Attributes | |
| JButton | startButton |
| JTextField | inputCmd |
| JTextArea | logArea |
| Traceroute | tracer |
| JComboBox | ifaceList |
Static Private Attributes | |
| static final long | serialVersionUID = 3590355845490077407L |
| Implements java.io.Serializable interface. | |
Trace-route/ping application using ICMP from Jpcap.
Definition at line 28 of file TraceroutePane.java.
| TraceroutePane.TraceroutePane | ( | String | args[] ) |
Creates a new instance of the ChatClientFrame.
| args | the command line arguments passed to main |
Definition at line 48 of file TraceroutePane.java.
References Traceroute.getInterfaceList(), ifaceList, inputCmd, logArea, logNewLine(), parseCommand(), println(), startButton, startButton_Clicked(), and tracer.
Referenced by main().
{
super( "IP1-4.3: Traceroute, Idle" );
setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
//////////////////////////////////////////////////////////////////////////////////
/* GUI Components
*/
Font textFont = new Font( Font.SANS_SERIF, Font.PLAIN, 14 );
Font logFont = new Font( Font.MONOSPACED, Font.PLAIN, 16 );
inputCmd = new JTextField( "atlas.dsv.su.se" );
inputCmd.setFont( textFont );
inputCmd.setColumns( 30 );
inputCmd.selectAll ();
startButton = new JButton ();
startButton.setText( "Go!" );
startButton.setForeground( Color.black );
startButton.addMouseListener(
new MouseAdapter () {
public void mouseClicked( MouseEvent evt ) {
startButton_Clicked( evt );
}
}
);
ifaceList = new JComboBox ();
ifaceList.setEditable( false );
/* Scrollable log area
*/
logArea = new JTextArea ();
logArea.setLineWrap( true );
logArea.setWrapStyleWord( true );
logArea.setEditable( false );
logArea.setFont( logFont );
logArea.setBackground( new Color( 32, 32, 0 ) );
logArea.setForeground( new Color( 240, 192, 0 ) );
JScrollPane logPane = new JScrollPane ();
logPane.setViewportView( logArea );
//////////////////////////////////////////////////////////////////////////////////
/* Layout (self explained?):
* Upper: startButton, inputCmd and ifaceList
* Lower: logPane
*/
GroupLayout layout = new GroupLayout( getContentPane () );
getContentPane().setLayout( layout );
layout.setAutoCreateContainerGaps( true );
layout.setAutoCreateGaps( true );
layout.setHorizontalGroup
(
layout
.createParallelGroup( Alignment.LEADING )
.addGroup
(
layout
.createSequentialGroup ()
.addGroup
(
layout
.createParallelGroup( Alignment.LEADING )
.addGroup
(
Alignment.TRAILING,
layout
.createSequentialGroup ()
.addComponent( startButton, 80, 80, 80 )
.addComponent( inputCmd )
.addComponent( ifaceList, 100, 300, 300 )
)
.addComponent( logPane )
)
)
);
layout.setVerticalGroup
(
layout
.createParallelGroup( Alignment.LEADING )
.addGroup
(
layout
.createSequentialGroup ()
.addGroup
(
layout
.createParallelGroup( Alignment.CENTER )
.addComponent( startButton )
.addComponent( inputCmd, Alignment.CENTER, 0, 27, 27 )
.addComponent( ifaceList, Alignment.CENTER, 0, 26, 26 )
)
.addComponent( logPane )
)
);
pack();
//////////////////////////////////////////////////////////////////////////////////
/* Adjust window dimensions not to exceed screen dimensions ...
*/
Dimension win = new Dimension( 1024, 600 );
Dimension scsz = Toolkit.getDefaultToolkit().getScreenSize();
win.width = Math.min( win.width, scsz.width );
win.height = Math.min( win.height, scsz.height - 40 );
setSize( win );
/* ... then center window on the screen.
*/
setLocation( ( scsz.width - win.width )/2, ( scsz.height - 40 - win.height )/2 );
/* Ready for user to type in something...
*/
inputCmd.requestFocus ();
/* Keyboard event handler for ENTER in input text field
*/
inputCmd.addKeyListener( new KeyAdapter ()
{
@Override public void keyPressed( KeyEvent e )
{
int keyCode = e.getKeyCode ();
if( keyCode == KeyEvent.VK_ENTER )
{
parseCommand ();
}
}
} );
/* Creates trace-route instance. We should have heavy exception handling here
* as we are relying on external components: Jpcap and WinPCAP.
* Both must be installed properly for <code>Traceroute</code> to be
* instantiated.
*/
try
{
tracer = new Traceroute ( this );
}
catch( NoClassDefFoundError e ) // Jpcap is probably missing
{
tracer = null;
if ( e.getMessage().toLowerCase().contains( "jpcap" ) )
{
println( " " );
println( " ERROR:" );
println( " Jpcap is not installed!" );
logNewLine ();
println( " Please, download and install Jpcap from: " );
println( " http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/download.html" );
logNewLine ();
println( " You will also need to get and install WinPCAP from: " );
println( " http://www.winpcap.org/install/default.htm" );
}
else
{
e.printStackTrace ();
}
}
catch( UnsatisfiedLinkError e ) // Wincap is probably missing
{
tracer = null;
if ( e.getMessage().toLowerCase().contains( "cap.dll" ) )
{
println( " " );
println( " ERROR:" );
println( " WinPCAP is not installed!" );
logNewLine ();
println( " Please, download and install WinPCAP from: " );
println( " http://www.winpcap.org/install/default.htm" );
logNewLine ();
}
else
{
e.printStackTrace ();
}
}
if ( tracer != null ) // survived Jpcap & WinPCAP i.e. up and running
{
/* Print usage
*/
println( " " );
println( " Usage:" );
println( " 1) Select network interface used for transmission"
+ " (from the upper right combo box)" );
println( " 2) Enter hostname then press Enter or click 'Go!'" );
logNewLine ();
println( " To ping instead to trace route, add 'ping' after the hostname." );
logNewLine ();
/* Add all interfaces to combo box
*/
for( String s : tracer.getInterfaceList () )
{
ifaceList.addItem( s );
}
}
/* Transfer command line arguments into inputCmd (if any)
* then parse them immediately...
*/
if ( args.length > 0 )
{
String join = "";
for( String s : args ) {
join += ( join.length () == 0 ? s : " " + s );
}
inputCmd.setText( join );
parseCommand ();
}
}
| void TraceroutePane.logMessage | ( | String | str, |
| boolean | timestamp | ||
| ) | [virtual] |
Logs message, with optional timestamp.
| str | message that will be logged |
| timestamp | whether to prefix message with timestamp or not |
Implements Traceroute.Context.
Definition at line 326 of file TraceroutePane.java.
References logArea, logNewLine(), and now().
Referenced by println().
{
synchronized( logArea )
{
if ( timestamp )
{
// Ensure that there is a new-line before time-stamp
//
String log = logArea.getText ();
if ( log.length () > 0 && log.charAt( log.length () - 1 ) != '\n' ) {
logNewLine ();
}
logArea.append( now () + " " + str );
}
else
{
logArea.append( str );
}
logArea.setCaretPosition( logArea.getText().length () );
}
}
| void TraceroutePane.logNewLine | ( | ) | [virtual] |
Logs new line.
Implements Traceroute.Context.
Definition at line 306 of file TraceroutePane.java.
References logArea.
Referenced by logMessage(), println(), and TraceroutePane().
| static void TraceroutePane.main | ( | String | args[] ) | [static] |
Main entry point.
Creates and makes visible GUI...
| args | the command line arguments |
Definition at line 409 of file TraceroutePane.java.
References TraceroutePane().
{
final String[] copyOfArgs = args;
java.awt.EventQueue.invokeLater(
new Runnable() {
public void run() {
new TraceroutePane( copyOfArgs ).setVisible( true );
}
}
);
}
| static String TraceroutePane.now | ( | ) | [static, private] |
Gets current time stamp (millis resolution)
Definition at line 286 of file TraceroutePane.java.
Referenced by logMessage().
{
Calendar cal = Calendar.getInstance ();
SimpleDateFormat sdf = new SimpleDateFormat( "HH:mm:ss.SSS" );
return sdf.format( cal.getTime() );
}
| void TraceroutePane.onTracerouteCompleted | ( | ) | [virtual] |
On trace route completed call-back from the instance of Traceroute
Implements Traceroute.Context.
Definition at line 354 of file TraceroutePane.java.
References startButton.
{
setTitle( "IP1-4.3: Traceroute, Idle" );
startButton.setText( "Go!" );
startButton.setForeground( Color.black );
}
| void TraceroutePane.parseCommand | ( | ) |
Parses input message or command from inputMsg.
Also performs various commands :open, :close, :exit ...
Definition at line 365 of file TraceroutePane.java.
References ifaceList, inputCmd, Traceroute.isIdle(), startButton, Traceroute.startPinging(), Traceroute.stopTrace(), and tracer.
Referenced by startButton_Clicked(), and TraceroutePane().
{
if ( tracer == null ) {
return;
}
/* Split string into words, removing all leading, trailing
* and superfluous (btw words) white-spaces
*/
String[] args = inputCmd.getText().trim().split( "\\s{1,}" );
if ( args.length < 1 ) {
return;
}
if ( tracer.isIdle () )
{
boolean ping = ( args.length >= 2 && args[1].equalsIgnoreCase("ping") );
startButton.setText( "Cancel" );
startButton.setForeground( Color.red );
if ( ping ) {
setTitle( "IP1-4.3: Pinging " + args[0] + "..." );
} else {
setTitle( "IP1-4.3: Tracing route to " + args[0] + "..." );
}
/* Start trace-route/ping. TTL is set to 64 if second word in cmd line
* is 'ping'.
*/
tracer.startPinging( ifaceList.getSelectedIndex (), args[0], ping ? 64 : 0 );
}
else
{
tracer.stopTrace ();
}
}
| void TraceroutePane.println | ( | String | str ) |
println() == short cut for logMesage() + logNewLine () without timestamp
Definition at line 296 of file TraceroutePane.java.
References logMessage(), and logNewLine().
Referenced by TraceroutePane().
{
logMessage( str, /*timestamp*/ false );
logNewLine ();
}
| void TraceroutePane.startButton_Clicked | ( | MouseEvent | evt ) | [private] |
Starts fetching data from URL specified in urlText.
Definition at line 276 of file TraceroutePane.java.
References parseCommand().
Referenced by TraceroutePane().
{
parseCommand ();
}
JComboBox TraceroutePane.ifaceList [private] |
Definition at line 41 of file TraceroutePane.java.
Referenced by parseCommand(), and TraceroutePane().
JTextField TraceroutePane.inputCmd [private] |
Definition at line 38 of file TraceroutePane.java.
Referenced by parseCommand(), and TraceroutePane().
JTextArea TraceroutePane.logArea [private] |
Definition at line 39 of file TraceroutePane.java.
Referenced by logMessage(), logNewLine(), and TraceroutePane().
final long TraceroutePane.serialVersionUID = 3590355845490077407L [static, private] |
Implements java.io.Serializable interface.
Definition at line 33 of file TraceroutePane.java.
JButton TraceroutePane.startButton [private] |
Definition at line 37 of file TraceroutePane.java.
Referenced by onTracerouteCompleted(), parseCommand(), and TraceroutePane().
Traceroute TraceroutePane.tracer [private] |
Definition at line 40 of file TraceroutePane.java.
Referenced by parseCommand(), and TraceroutePane().
1.7.2